// RUN: fir-opt --split-input-file --fir-add-alias-tags %s | FileCheck %s // Fortran source: // subroutine test1 // real :: a, b // common /common1/ a, b // a = b // end subroutine test1 module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @common1_(dense<0> : vector<8xi8>) {alignment = 4 : i64} : !fir.array<8xi8> func.func @_QPtest1() { %c4 = arith.constant 4 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %addr1 = fir.address_of(@common1_) : !fir.ref> %addr2 = fir.address_of(@common1_) : !fir.ref> %2 = fir.coordinate_of %addr1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref %4 = fir.declare %3 storage(%addr1[0]) {uniq_name = "_QFtest1Ea"} : (!fir.ref, !fir.ref>) -> !fir.ref %5 = fir.coordinate_of %addr2, %c4 : (!fir.ref>, index) -> !fir.ref %6 = fir.convert %5 : (!fir.ref) -> !fir.ref %7 = fir.declare %6 storage(%addr2[4]) {uniq_name = "_QFtest1Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %8 = fir.load %7 : !fir.ref fir.store %8 to %4 : !fir.ref return } } // CHECK: #[[$ATTR_0:.+]] = #llvm.tbaa_root // CHECK: #[[$ATTR_1:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_2:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_4:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_5:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_6:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_7:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_8:.+]] = #llvm.tbaa_tag // CHECK: #[[$ATTR_9:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest1() { // CHECK: fir.load{{.*}}{tbaa = [#[[$ATTR_8]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[$ATTR_9]]]} : !fir.ref // ----- // Fortran source: // subroutine test2 // real :: a, b // common /common2/ a // equivalence (a, b) // a = b // end subroutine test2 module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @common2_(dense<0> : vector<4xi8>) {alignment = 4 : i64} : !fir.array<4xi8> func.func @_QPtest2() { %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@common2_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ptr %4 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest2Ea"} : (!fir.ptr, !fir.ref>) -> !fir.ptr %5 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest2Eb"} : (!fir.ptr, !fir.ref>) -> !fir.ptr %6 = fir.load %5 : !fir.ptr fir.store %6 to %4 : !fir.ptr return } } // CHECK: #[[$ATTR_10:.+]] = #llvm.tbaa_root // CHECK: #[[$ATTR_11:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_12:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_14:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_15:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_16:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_18:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest2() { // CHECK: fir.load{{.*}}{tbaa = [#[[$ATTR_18]]]} : !fir.ptr // CHECK: fir.store{{.*}}{tbaa = [#[[$ATTR_18]]]} : !fir.ptr // ----- // Fortran source compiled with -mmlir -inline-all: // subroutine test3 // real :: a, b // common /common3/ a, b // a = b // call inner(a, b) // contains // subroutine inner(c, d) // real :: c, d // c = d // end subroutine inner // end subroutine test3 module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @common3_(dense<0> : vector<8xi8>) {alignment = 4 : i64} : !fir.array<8xi8> func.func @_QPtest3() { %c4 = arith.constant 4 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@common3_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref %4 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest3Ea"} : (!fir.ref, !fir.ref>) -> !fir.ref %5 = fir.coordinate_of %1, %c4 : (!fir.ref>, index) -> !fir.ref %6 = fir.convert %5 : (!fir.ref) -> !fir.ref %7 = fir.declare %6 storage(%1[4]) {uniq_name = "_QFtest3Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %8 = fir.load %7 : !fir.ref fir.store %8 to %4 : !fir.ref %9 = fir.dummy_scope : !fir.dscope %10 = fir.declare %4 dummy_scope %9 {uniq_name = "_QFtest3FinnerEc"} : (!fir.ref, !fir.dscope) -> !fir.ref %11 = fir.declare %7 dummy_scope %9 {uniq_name = "_QFtest3FinnerEd"} : (!fir.ref, !fir.dscope) -> !fir.ref %12 = fir.load %11 : !fir.ref fir.store %12 to %10 : !fir.ref return } } // CHECK: #[[ROOT3:.+]] = #llvm.tbaa_root // CHECK: #[[ROOT3INNER:.+]] = #llvm.tbaa_root // CHECK: #[[ANYACC3:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[ANYACC3INNER:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[ANYDATA3:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[ANYDATA3INNER:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[GLOBALDATA3:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[DUMMYARG3INNER:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[GLOBALDATA3COMMON3:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[DUMMYD:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[DUMMYC:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[DUMMYDTAG:.+]] = #llvm.tbaa_tag // CHECK: #[[DUMMYCTAG:.+]] = #llvm.tbaa_tag // CHECK: #[[GLOBALB:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[GLOBALA:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[GLOBALBTAG:.+]] = #llvm.tbaa_tag // CHECK: #[[GLOBALATAG:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest3() { // CHECK: fir.load{{.*}}{tbaa = [#[[GLOBALBTAG]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[GLOBALATAG]]]} : !fir.ref // CHECK: fir.load{{.*}}{tbaa = [#[[DUMMYDTAG]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[DUMMYCTAG]]]} : !fir.ref // ----- // Fortran source compiled with -mmlir -inline-all: // subroutine test4 // real :: a, b // common /common4/ a, b // a = b // call inner // contains // subroutine inner // real :: c, d // common /common4/ c, d // c = d // end subroutine inner // end subroutine test4 module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @common4_(dense<0> : vector<8xi8>) {alignment = 4 : i64} : !fir.array<8xi8> func.func @_QPtest4() { %c4 = arith.constant 4 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@common4_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref %4 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest4Ea"} : (!fir.ref, !fir.ref>) -> !fir.ref %5 = fir.coordinate_of %1, %c4 : (!fir.ref>, index) -> !fir.ref %6 = fir.convert %5 : (!fir.ref) -> !fir.ref %7 = fir.declare %6 storage(%1[4]) {uniq_name = "_QFtest4Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %8 = fir.load %7 : !fir.ref fir.store %8 to %4 : !fir.ref %9 = fir.dummy_scope : !fir.dscope %10 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest4FinnerEc"} : (!fir.ref, !fir.ref>) -> !fir.ref %11 = fir.declare %6 storage(%1[4]) {uniq_name = "_QFtest4FinnerEd"} : (!fir.ref, !fir.ref>) -> !fir.ref %12 = fir.load %11 : !fir.ref fir.store %12 to %10 : !fir.ref return } } // CHECK: #[[TEST4ROOT:.+]] = #llvm.tbaa_root // CHECK: #[[INNER4ROOT:.+]] = #llvm.tbaa_root // CHECK: #[[TEST4ANYCC:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4ANYACC:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4ANYDATA:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4ANYDATA:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4GLOBAL:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4GLOBAL:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4COMMON:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4COMMON:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4B:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4A:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4D:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[INNER4C:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST4BTAG:.+]] = #llvm.tbaa_tag // CHECK: #[[TEST4ATAG:.+]] = #llvm.tbaa_tag // CHECK: #[[INNER4DTAG:.+]] = #llvm.tbaa_tag // CHECK: #[[INNER4CTAG:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest4() { // CHECK: fir.load{{.*}}{tbaa = [#[[TEST4BTAG]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[TEST4ATAG]]]} : !fir.ref // CHECK: fir.load{{.*}}{tbaa = [#[[INNER4DTAG]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[INNER4CTAG]]]} : !fir.ref // ----- // Fortran source with manually removed fir.declare for 'b': // subroutine test5 // real :: a, b // common /common5/ a, b // a = b // end subroutine test5 module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @common5_(dense<0> : vector<8xi8>) {alignment = 4 : i64} : !fir.array<8xi8> func.func @_QPtest5() { %c4 = arith.constant 4 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@common5_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref %4 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtest5Ea"} : (!fir.ref, !fir.ref>) -> !fir.ref %5 = fir.coordinate_of %1, %c4 : (!fir.ref>, index) -> !fir.ref %6 = fir.convert %5 : (!fir.ref) -> !fir.ref // %7 = fir.declare %6 storage(%1[4]) {uniq_name = "_QFtest5Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %8 = fir.load %6 : !fir.ref fir.store %8 to %4 : !fir.ref return } } // CHECK: #[[TEST5ROOT:.+]] = #llvm.tbaa_root // CHECK: #[[TEST5ANYACC:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST5ANYDATA:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST5GLOBAL:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST5COMMON5:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST5COMMON5TAG:.+]] = #llvm.tbaa_tag // CHECK: #[[TEST5A:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[TEST5ATAG:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest5() { // CHECK: fir.load{{.*}}{tbaa = [#[[TEST5COMMON5TAG]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[TEST5ATAG]]]} : !fir.ref // ----- // Fortran source: // module m1 // common /block/ a(10), b(10) // end // module m2 // common /block/ c(20) // end // subroutine test6 // use m1 // use m2 // a(1) = c(1) + b(1) // end subroutine test6 // // Test that all accesses are using the same TBAA tag. module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @block_(dense<0> : vector<80xi8>) {alignment = 4 : i64} : !fir.array<80xi8> func.func @_QPtest6() { %c1 = arith.constant 1 : index %c20 = arith.constant 20 : index %c40 = arith.constant 40 : index %c10 = arith.constant 10 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@block_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref> %4 = fir.shape %c10 : (index) -> !fir.shape<1> %5 = fir.declare %3(%4) storage(%1[0]) {uniq_name = "_QMm1Ea"} : (!fir.ref>, !fir.shape<1>, !fir.ref>) -> !fir.ref> %6 = fir.coordinate_of %1, %c40 : (!fir.ref>, index) -> !fir.ref %7 = fir.convert %6 : (!fir.ref) -> !fir.ref> %8 = fir.declare %7(%4) storage(%1[40]) {uniq_name = "_QMm1Eb"} : (!fir.ref>, !fir.shape<1>, !fir.ref>) -> !fir.ref> %9 = fir.convert %2 : (!fir.ref) -> !fir.ref> %10 = fir.shape %c20 : (index) -> !fir.shape<1> %11 = fir.declare %9(%10) storage(%1[0]) {uniq_name = "_QMm2Ec"} : (!fir.ref>, !fir.shape<1>, !fir.ref>) -> !fir.ref> %12 = fir.array_coor %11(%10) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref %13 = fir.load %12 : !fir.ref %14 = fir.array_coor %8(%4) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref %15 = fir.load %14 : !fir.ref %16 = arith.addf %13, %15 fastmath : f32 %17 = fir.array_coor %5(%4) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref fir.store %16 to %17 : !fir.ref return } } // CHECK: #[[$ATTR_0:.+]] = #llvm.tbaa_root // CHECK: #[[$ATTR_1:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_2:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_4:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_5:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_6:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_7:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest6() { // CHECK: fir.load{{.*}}{tbaa = [#[[$ATTR_7]]]} : !fir.ref // CHECK: fir.load{{.*}}{tbaa = [#[[$ATTR_7]]]} : !fir.ref // CHECK: fir.store{{.*}}{tbaa = [#[[$ATTR_7]]]} : !fir.ref // ----- // Fortran source: // module m1 // integer :: b // common /block/ a(10), b // end // module m2 // real, pointer :: p // common /block/ p // end // subroutine test7 // use m1 // use m2 // a(1) = p + b // end subroutine test7 // // Test that: // * access to 'p' is tagged with "target data", // * access to 'b' is tagged with global data/block_/bytes_40_to_43 // * access to 'a' is not tagged, because it overlaps with // a descriptor. module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @block_(dense<0> : vector<44xi8>) {alignment = 4 : i64} : !fir.array<44xi8> func.func @_QPtest7() { %c1 = arith.constant 1 : index %c40 = arith.constant 40 : index %c10 = arith.constant 10 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@block_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref> %4 = fir.shape %c10 : (index) -> !fir.shape<1> %5 = fir.declare %3(%4) storage(%1[0]) {uniq_name = "_QMm1Ea"} : (!fir.ref>, !fir.shape<1>, !fir.ref>) -> !fir.ref> %6 = fir.coordinate_of %1, %c40 : (!fir.ref>, index) -> !fir.ref %7 = fir.convert %6 : (!fir.ref) -> !fir.ref %8 = fir.declare %7 storage(%1[40]) {uniq_name = "_QMm1Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %9 = fir.convert %1 : (!fir.ref>) -> !fir.ref> %10 = fir.coordinate_of %9, %c0 : (!fir.ref>, index) -> !fir.ref %11 = fir.convert %10 : (!fir.ref) -> !fir.ref>> %12 = fir.declare %11 storage(%9[0]) {fortran_attrs = #fir.var_attrs, uniq_name = "_QMm2Ep"} : (!fir.ref>>, !fir.ref>) -> !fir.ref>> %13 = fir.load %12 : !fir.ref>> %14 = fir.box_addr %13 : (!fir.box>) -> !fir.ptr %15 = fir.load %14 : !fir.ptr %16 = fir.load %8 : !fir.ref %17 = fir.convert %16 : (i32) -> f32 %18 = arith.addf %15, %17 fastmath : f32 %19 = fir.array_coor %5(%4) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref fir.store %18 to %19 : !fir.ref return } } // CHECK: #[[$ATTR_73:.+]] = #llvm.tbaa_root // CHECK: #[[$ATTR_74:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_75:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_76:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_78:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_77:.+]] = #llvm.tbaa_tag // CHECK: #[[$ATTR_79:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_80:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_81:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest7() { // CHECK: fir.load %{{[0-9]+}} : !fir.ref>> // CHECK: fir.load{{.*}} {tbaa = [#[[$ATTR_77]]]} : !fir.ptr // CHECK: fir.load{{.*}}{tbaa = [#[[$ATTR_81]]]} : !fir.ref // CHECK: fir.store %{{[0-9]+}} to %{{[0-9]+}} : !fir.ref // ----- // Fortran source: // module m1 // integer :: b // common /block/ a(10), b // end // module m2 // real, pointer :: p // common /block/ p // end // subroutine test8 // use m1 // use m2 // a(1) = p + b // end subroutine test8 // // The storage for 'b' is manually made ambiguous. // Test that none of the global data accesses is tagged, // because there is member containing descriptor in 'block', // and we cannot reliably trace the storage for 'b'. // In most cases, the storage should be traceable. module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @block_(dense<0> : vector<44xi8>) {alignment = 4 : i64} : !fir.array<44xi8> func.func @_QPtest8() { %c1 = arith.constant 1 : index %c40 = arith.constant 40 : index %c10 = arith.constant 10 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@block_) : !fir.ref> %ptrcast = fir.convert %1 : (!fir.ref>) -> !fir.llvm_ptr> %tmpmem = fir.alloca !fir.llvm_ptr> fir.store %ptrcast to %tmpmem : !fir.ref>> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref> %4 = fir.shape %c10 : (index) -> !fir.shape<1> %5 = fir.declare %3(%4) storage(%1[0]) {uniq_name = "_QMm1Ea"} : (!fir.ref>, !fir.shape<1>, !fir.ref>) -> !fir.ref> %6 = fir.coordinate_of %1, %c40 : (!fir.ref>, index) -> !fir.ref %7 = fir.convert %6 : (!fir.ref) -> !fir.ref %addr = fir.load %tmpmem : !fir.ref>> %addrcast = fir.convert %addr : (!fir.llvm_ptr>) -> !fir.ref> %8 = fir.declare %7 storage(%addrcast[40]) {uniq_name = "_QMm1Eb"} : (!fir.ref, !fir.ref>) -> !fir.ref %9 = fir.convert %1 : (!fir.ref>) -> !fir.ref> %10 = fir.coordinate_of %9, %c0 : (!fir.ref>, index) -> !fir.ref %11 = fir.convert %10 : (!fir.ref) -> !fir.ref>> %12 = fir.declare %11 storage(%9[0]) {fortran_attrs = #fir.var_attrs, uniq_name = "_QMm2Ep"} : (!fir.ref>>, !fir.ref>) -> !fir.ref>> %13 = fir.load %12 : !fir.ref>> %14 = fir.box_addr %13 : (!fir.box>) -> !fir.ptr %15 = fir.load %14 : !fir.ptr %16 = fir.load %8 : !fir.ref %17 = fir.convert %16 : (i32) -> f32 %18 = arith.addf %15, %17 fastmath : f32 %19 = fir.array_coor %5(%4) %c1 : (!fir.ref>, !fir.shape<1>, index) -> !fir.ref fir.store %18 to %19 : !fir.ref return } } // CHECK: #[[$ATTR_82:.+]] = #llvm.tbaa_root // CHECK: #[[$ATTR_83:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_84:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_87:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_85:.+]] = #llvm.tbaa_type_desc}> // CHECK: #[[$ATTR_88:.+]] = #llvm.tbaa_tag // CHECK: #[[$ATTR_86:.+]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtest8() { // CHECK: fir.load %{{[0-9]+}} : !fir.ref>> // CHECK: fir.load %{{[0-9]+}} {tbaa = [#[[$ATTR_86]]]} : !fir.ptr // CHECK: fir.load %{{[0-9]+}} : !fir.ref // CHECK: fir.store %{{[0-9]+}} to %{{[0-9]+}} : !fir.ref // ----- // Fortran source: // subroutine target_comon_tbaa() // real :: a // real, target :: b, c // common /common1/ a,b,c // a = b // end subroutine // // Test generation of tbaa tags where some members of a common block are TARGET module attributes {dlti.dl_spec = #dlti.dl_spec : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<[32, 64]> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little">, llvm.data_layout = ""} { fir.global common @block_(dense<0> : vector<44xi8>) {alignment = 4 : i64} : !fir.array<44xi8> fir.global common @common1_(dense<0> : vector<12xi8>) {alignment = 4 : i64} : !fir.array<12xi8> func.func @_QPtarget_common_tbaa() { %c8 = arith.constant 8 : index %c4 = arith.constant 4 : index %c0 = arith.constant 0 : index %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@common1_) : !fir.ref> %2 = fir.coordinate_of %1, %c0 : (!fir.ref>, index) -> !fir.ref %3 = fir.convert %2 : (!fir.ref) -> !fir.ref %4 = fir.declare %3 storage(%1[0]) {uniq_name = "_QFtarget_comon_tbaaEa"} : (!fir.ref, !fir.ref>) -> !fir.ref %5 = fir.coordinate_of %1, %c4 : (!fir.ref>, index) -> !fir.ref %6 = fir.convert %5 : (!fir.ref) -> !fir.ref %7 = fir.declare %6 storage(%1[4]) {fortran_attrs = #fir.var_attrs, uniq_name = "_QFtarget_comon_tbaaEb"} : (!fir.ref, !fir.ref>) -> !fir.ref %8 = fir.coordinate_of %1, %c8 : (!fir.ref>, index) -> !fir.ref %9 = fir.convert %8 : (!fir.ref) -> !fir.ref %10 = fir.declare %9 storage(%1[8]) {fortran_attrs = #fir.var_attrs, uniq_name = "_QFtarget_comon_tbaaEc"} : (!fir.ref, !fir.ref>) -> !fir.ref %11 = fir.load %7 : !fir.ref fir.store %11 to %4 : !fir.ref return } } // CHECK: #[[TBAA_FUNC_ROOT:.*]] = #llvm.tbaa_root // CHECK-NEXT: #[[ANY_ACCESS:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[ANY_DATA:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[TARGET_DATA:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[GLOBAL_DATA:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[TARGET_COMMON:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[GLOBAL_COMMON:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[B:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[A:.*]] = #llvm.tbaa_type_desc}> // CHECK-NEXT: #[[B_TAG:.*]] = #llvm.tbaa_tag // CHECK-NEXT: #[[A_TAG:.*]] = #llvm.tbaa_tag // CHECK-LABEL: func.func @_QPtarget_common_tbaa() // CHECK: %[[LOAD:.*]] = fir.load %{{.*}} {tbaa = [#[[B_TAG]]]} // CHECK: fir.store %[[LOAD]] to %{{.*}} {tbaa = [#[[A_TAG]]]}