// Test that tbaa attributes can be added to fir.load and fir.store // and that these attributes are propagated to LLVMIR // RUN: tco %s | FileCheck %s // subroutine simple(a) // integer, intent(inout) :: a(:) // a(1) = a(2) // end subroutine #tbaa_root = #llvm.tbaa_root #tbaa_type_desc = #llvm.tbaa_type_desc}> #tbaa_type_desc1 = #llvm.tbaa_type_desc}> #tbaa_type_desc2 = #llvm.tbaa_type_desc}> #tbaa_type_desc3 = #llvm.tbaa_type_desc}> #tbaa_tag = #llvm.tbaa_tag module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.target_triple = "aarch64-unknown-linux-gnu"} { func.func @_QPsimple(%arg0: !fir.box> {fir.bindc_name = "a"}) { %c1 = arith.constant 1 : index %c2 = arith.constant 2 : index %0 = fir.declare %arg0 {fortran_attrs = #fir.var_attrs, uniq_name = "_QFfuncEa"} : (!fir.box>) -> !fir.box> %1 = fir.rebox %0 : (!fir.box>) -> !fir.box> %2 = fir.array_coor %1 %c2 : (!fir.box>, index) -> !fir.ref %3 = fir.load %2 {tbaa = [#tbaa_tag]} : !fir.ref %4 = fir.array_coor %1 %c1 : (!fir.box>, index) -> !fir.ref fir.store %3 to %4 {tbaa = [#tbaa_tag]} : !fir.ref return } } // CHECK-LABEL: define void @_QPsimple( // CHECK-SAME: ptr %[[ARG0:.*]]){{.*}}{ // [...] // load a(2): // CHECK: %[[VAL20:.*]] = getelementptr i8, ptr %{{.*}}, i64 %{{.*}} // CHECK: %[[A2:.*]] = load i32, ptr %[[VAL20]], align 4, !tbaa ![[A_ACCESS_TAG:.*]] // [...] // store a(2) to a(1): // CHECK: %[[A1:.*]] = getelementptr i8, ptr %{{.*}}, i64 %{{.*}} // CHECK: store i32 %[[A2]], ptr %[[A1]], align 4, !tbaa ![[A_ACCESS_TAG]] // CHECK: ret void // CHECK: } // CHECK: ![[ANY_ACCESS_TYPE:.*]] = !{!"any access", ![[ROOT:.*]], i64 0} // CHECK: ![[ROOT]] = !{!"Flang function root _QPsimple"} // CHECK: ![[A_ACCESS_TAG]] = !{![[A_ACCESS_TYPE:.*]], ![[A_ACCESS_TYPE]], i64 0} // CHECK: ![[A_ACCESS_TYPE]] = !{!"dummy arg data/_QFfuncEa", ![[DUMMY_ARG_TYPE:.*]], i64 0} // CHECK: ![[DUMMY_ARG_TYPE]] = !{!"dummy arg data", ![[DATA_ACCESS_TYPE:.*]], i64 0} // CHECK: ![[DATA_ACCESS_TYPE]] = !{!"any data access", ![[ANY_ACCESS_TYPE]], i64 0}