|
| 1 | +// RUN: fir-opt %s -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' 2>&1 | FileCheck %s |
| 2 | + |
| 3 | +// The test was obtained from |
| 4 | +// bbc test.f90 -emit-fir |
| 5 | +// module mod |
| 6 | +// real, pointer :: p0 |
| 7 | +// real, allocatable :: alloc |
| 8 | +// real, allocatable, target :: t_alloc |
| 9 | +// real, target :: t |
| 10 | +// real :: v |
| 11 | +// end module |
| 12 | +// |
| 13 | +// subroutine test(n) |
| 14 | +// use mod |
| 15 | +// integer :: n |
| 16 | +// real r1 |
| 17 | +// p0 => t_alloc |
| 18 | +// v = alloc |
| 19 | +// r1 = p0 |
| 20 | +// end subroutine test |
| 21 | + |
| 22 | +// Checking that aliasing can only happen with an entity with the target attribute |
| 23 | +// |
| 24 | +// CHECK-DAG: r1#0 <-> t_alloc#0: NoAlias |
| 25 | +// CHECK-DAG: r1#0 <-> alloc#0: NoAlias |
| 26 | +// CHECK-DAG: t_alloc#0 <-> alloc#0: NoAlias |
| 27 | +// CHECK-DAG: r1#0 <-> p0.ptr#0: NoAlias |
| 28 | +// CHECK-DAG: t_alloc#0 <-> p0.ptr#0: MayAlias |
| 29 | +// CHECK-DAG: alloc#0 <-> p0.ptr#0: NoAlias |
| 30 | + |
| 31 | +fir.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 | +} |
| 36 | +fir.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 | +} |
| 41 | +fir.global @_QMmodEt target : f32 { |
| 42 | + %0 = fir.zero_bits f32 |
| 43 | + fir.has_value %0 : f32 |
| 44 | +} |
| 45 | +fir.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 | +} |
| 50 | +fir.global @_QMmodEv : f32 { |
| 51 | + %0 = fir.zero_bits f32 |
| 52 | + fir.has_value %0 : f32 |
| 53 | +} |
| 54 | +func.func @_QPtest(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}) { |
| 55 | + %0 = fir.dummy_scope : !fir.dscope |
| 56 | + %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 | + return |
| 82 | +} |
0 commit comments