blob: ef3b12d9c449c7359f56338b77064a02274a8030 [file] [edit]
// Check that cray pointers might alias with everything.
// RUN: fir-opt %s -unsafe-cray-pointers -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' -mlir-disable-threading 2>&1 | FileCheck %s
// RUN: fir-opt %s -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' -mlir-disable-threading 2>&1 | FileCheck --check-prefix=DEFAULT %s
// Fortran source:
// subroutine test()
// real :: a, b
// pointer(p, a)
// p = loc(b)
// end subroutine
// CHECK-LABEL: Testing : "_QPtest"
// CHECK-DAG: p#0 <-> b#0: MayAlias
// CHECK-DAG: p#1 <-> b#0: MayAlias
// CHECK-DAG: p#0 <-> b#1: MayAlias
// CHECK-DAG: p#1 <-> b#1: MayAlias
// CHECK-DAG: p#0 <-> a#0: MayAlias
// CHECK-DAG: p#1 <-> a#0: MayAlias
// CHECK-DAG: b#0 <-> a#0: MayAlias
// CHECK-DAG: b#1 <-> a#0: MayAlias
// CHECK-DAG: p#0 <-> a#1: MayAlias
// CHECK-DAG: p#1 <-> a#1: MayAlias
// CHECK-DAG: b#0 <-> a#1: MayAlias
// CHECK-DAG: b#1 <-> a#1: MayAlias
// By default, alias analysis assumes that cray pointers do not alias with
// non-target data. See flang/docs/Aliasing.md.
// DEFAULT-LABEL: Testing : "_QPtest"
// DEFAULT-DAG: p#0 <-> b#0: NoAlias
// DEFAULT-DAG: p#1 <-> b#0: NoAlias
// DEFAULT-DAG: p#0 <-> b#1: NoAlias
// DEFAULT-DAG: p#1 <-> b#1: NoAlias
// DEFAULT-DAG: p#0 <-> a#0: NoAlias
// DEFAULT-DAG: p#1 <-> a#0: NoAlias
// DEFAULT-DAG: b#0 <-> a#0: NoAlias
// DEFAULT-DAG: b#1 <-> a#0: NoAlias
// DEFAULT-DAG: p#0 <-> a#1: NoAlias
// DEFAULT-DAG: p#1 <-> a#1: NoAlias
// DEFAULT-DAG: b#0 <-> a#1: NoAlias
// DEFAULT-DAG: b#1 <-> a#1: NoAlias
func.func @_QPtest() {
%0 = fir.alloca !fir.box<!fir.ptr<f32>>
%1 = fir.dummy_scope : !fir.dscope
%2 = fir.alloca i64 {bindc_name = "p", uniq_name = "_QFtestEp"}
%3:2 = hlfir.declare %2 {test.ptr = "p", fortran_attrs = #fir.var_attrs<cray_pointer>, uniq_name = "_QFtestEp"} : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
%4 = fir.alloca f32 {bindc_name = "b", uniq_name = "_QFtestEb"}
%5:2 = hlfir.declare %4 {test.ptr = "b", uniq_name = "_QFtestEb"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
%6:2 = hlfir.declare %0 {test.ptr = "a", fortran_attrs = #fir.var_attrs<pointer, cray_pointee>, uniq_name = "_QFtestEa"} : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> (!fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>)
%7 = fir.zero_bits !fir.ptr<f32>
%8 = fir.embox %7 : (!fir.ptr<f32>) -> !fir.box<!fir.ptr<f32>>
fir.store %8 to %6#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>
%9 = fir.embox %5#0 : (!fir.ref<f32>) -> !fir.box<f32>
%10 = fir.box_addr %9 : (!fir.box<f32>) -> !fir.ref<f32>
%11 = fir.convert %10 : (!fir.ref<f32>) -> i64
hlfir.assign %11 to %3#0 : i64, !fir.ref<i64>
return
}