[LV] Remove hard-coded VPValue numbers in test check lines. (NFC)
[llvm-project.git] / flang / test / Fir / tbaa-codegen.fir
blob87bb15c0fea6ca3fef3108170e23c34a68384d2a
1 // Test that tbaa attributes can be added to fir.load and fir.store
2 // and that these attributes are propagated to LLVMIR
4 // RUN: tco %s | FileCheck %s
6 // subroutine simple(a)
7 //   integer, intent(inout) :: a(:)
8 //   a(1) = a(2)
9 // end subroutine
10 #tbaa_root = #llvm.tbaa_root<id = "Flang function root _QPsimple">
11 #tbaa_type_desc = #llvm.tbaa_type_desc<id = "any access", members = {<#tbaa_root, 0>}>
12 #tbaa_type_desc1 = #llvm.tbaa_type_desc<id = "any data access", members = {<#tbaa_type_desc, 0>}>
13 #tbaa_type_desc2 = #llvm.tbaa_type_desc<id = "dummy arg data", members = {<#tbaa_type_desc1, 0>}>
14 #tbaa_type_desc3 = #llvm.tbaa_type_desc<id = "dummy arg data/_QFfuncEa", members = {<#tbaa_type_desc2, 0>}>
15 #tbaa_tag = #llvm.tbaa_tag<base_type = #tbaa_type_desc3, access_type = #tbaa_type_desc3, offset = 0>
16 module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.target_triple = "aarch64-unknown-linux-gnu"} {
17   func.func @_QPsimple(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}) {
18     %c1 = arith.constant 1 : index
19     %c2 = arith.constant 2 : index
20     %0 = fir.declare %arg0 {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFfuncEa"} : (!fir.box<!fir.array<?xi32>>) -> !fir.box<!fir.array<?xi32>>
21     %1 = fir.rebox %0 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<!fir.array<?xi32>>
22     %2 = fir.array_coor %1 %c2 : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
23     %3 = fir.load %2 {tbaa = [#tbaa_tag]} : !fir.ref<i32>
24     %4 = fir.array_coor %1 %c1 : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
25     fir.store %3 to %4 {tbaa = [#tbaa_tag]} : !fir.ref<i32>
26     return
27   }
30 // CHECK-LABEL: define void @_QPsimple(
31 // CHECK-SAME:      ptr %[[ARG0:.*]]){{.*}}{
32 // [...]
33 // load  a(2):
34 // CHECK:  %[[VAL20:.*]] = getelementptr i8, ptr %{{.*}}, i64 %{{.*}}
35 // CHECK:  %[[A2:.*]] = load i32, ptr %[[VAL20]], align 4, !tbaa ![[A_ACCESS_TAG:.*]]
36 // [...]
37 // store a(2) to a(1):
38 // CHECK:  %[[A1:.*]] = getelementptr i8, ptr %{{.*}}, i64 %{{.*}}
39 // CHECK:  store i32 %[[A2]], ptr %[[A1]], align 4, !tbaa ![[A_ACCESS_TAG]]
40 // CHECK:  ret void
41 // CHECK: }
42 // CHECK: ![[ANY_ACCESS_TYPE:.*]] = !{!"any access", ![[ROOT:.*]], i64 0}
43 // CHECK: ![[ROOT]] = !{!"Flang function root _QPsimple"}
44 // CHECK: ![[A_ACCESS_TAG]] = !{![[A_ACCESS_TYPE:.*]], ![[A_ACCESS_TYPE]], i64 0}
45 // CHECK: ![[A_ACCESS_TYPE]] = !{!"dummy arg data/_QFfuncEa", ![[DUMMY_ARG_TYPE:.*]], i64 0}
46 // CHECK: ![[DUMMY_ARG_TYPE]] = !{!"dummy arg data", ![[DATA_ACCESS_TYPE:.*]], i64 0}
47 // CHECK: ![[DATA_ACCESS_TYPE]] = !{!"any data access", ![[ANY_ACCESS_TYPE]], i64 0}