1// RUN: mlir-opt %s | mlir-opt | FileCheck %s 2 3#tbaa_root_0 = #llvm.tbaa_root<id = "Simple C/C++ TBAA"> 4#tbaa_root_1 = #llvm.tbaa_root<id = "Other language TBAA"> 5#tbaa_root_2 = #llvm.tbaa_root 6#tbaa_type_desc_0 = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#tbaa_root_0, 0>}> 7#tbaa_tag_0 = #llvm.tbaa_tag<access_type = #tbaa_type_desc_0, base_type = #tbaa_type_desc_0, offset = 0> 8#tbaa_type_desc_1 = #llvm.tbaa_type_desc<id = "long long", members = {<#tbaa_type_desc_0, 0>}> 9#tbaa_type_desc_2 = #llvm.tbaa_type_desc<id = "int", members = {<#tbaa_type_desc_0, 0>}> 10#tbaa_type_desc_3 = #llvm.tbaa_type_desc<id = "agg2_t", members = {<#tbaa_type_desc_1, 0>, <#tbaa_type_desc_1, 8>}> 11#tbaa_type_desc_4 = #llvm.tbaa_type_desc<id = "agg1_t", members = {<#tbaa_type_desc_2, 0>, <#tbaa_type_desc_2, 4>}> 12#tbaa_tag_2 = #llvm.tbaa_tag<access_type = #tbaa_type_desc_1, base_type = #tbaa_type_desc_3, offset = 8> 13#tbaa_tag_3 = #llvm.tbaa_tag<access_type = #tbaa_type_desc_2, base_type = #tbaa_type_desc_4, offset = 0> 14#tbaa_type_desc_5 = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#tbaa_root_1, 0>}> 15#tbaa_type_desc_6 = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#tbaa_root_2, 0>}> 16#tbaa_tag_4 = #llvm.tbaa_tag<access_type = #tbaa_type_desc_6, base_type = #tbaa_type_desc_6, offset = 0> 17#tbaa_tag_1 = #llvm.tbaa_tag<access_type = #tbaa_type_desc_5, base_type = #tbaa_type_desc_5, offset = 0> 18 19// CHECK-DAG: #[[$ROOT_0:.*]] = #llvm.tbaa_root<id = "Simple C/C++ TBAA"> 20// CHECK-DAG: #[[$ROOT_1:.*]] = #llvm.tbaa_root<id = "Other language TBAA"> 21// CHECK-DAG: #[[$ROOT_2:.*]] = #llvm.tbaa_root 22// CHECK-NOT: <{{.*}}> 23// CHECK-DAG: #[[$DESC_0:.*]] = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#[[$ROOT_0]], 0>}> 24// CHECK-DAG: #[[$DESC_1:.*]] = #llvm.tbaa_type_desc<id = "long long", members = {<#[[$DESC_0]], 0>}> 25// CHECK-DAG: #[[$DESC_2:.*]] = #llvm.tbaa_type_desc<id = "int", members = {<#[[$DESC_0]], 0>}> 26// CHECK-DAG: #[[$DESC_3:.*]] = #llvm.tbaa_type_desc<id = "agg2_t", members = {<#[[$DESC_1]], 0>, <#[[$DESC_1]], 8>}> 27// CHECK-DAG: #[[$DESC_4:.*]] = #llvm.tbaa_type_desc<id = "agg1_t", members = {<#[[$DESC_2]], 0>, <#[[$DESC_2]], 4>}> 28// CHECK-DAG: #[[$DESC_5:.*]] = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#[[$ROOT_1]], 0>}> 29// CHECK-DAG: #[[$DESC_6:.*]] = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#[[$ROOT_2]], 0>}> 30// CHECK-DAG: #[[$TAG_0:.*]] = #llvm.tbaa_tag<base_type = #[[$DESC_0]], access_type = #[[$DESC_0]], offset = 0> 31// CHECK-DAG: #[[$TAG_1:.*]] = #llvm.tbaa_tag<base_type = #[[$DESC_5]], access_type = #[[$DESC_5]], offset = 0> 32// CHECK-DAG: #[[$TAG_2:.*]] = #llvm.tbaa_tag<base_type = #[[$DESC_3]], access_type = #[[$DESC_1]], offset = 8> 33// CHECK-DAG: #[[$TAG_3:.*]] = #llvm.tbaa_tag<base_type = #[[$DESC_4]], access_type = #[[$DESC_2]], offset = 0> 34// CHECK-DAG: #[[$TAG_4:.*]] = #llvm.tbaa_tag<base_type = #[[$DESC_6]], access_type = #[[$DESC_6]], offset = 0> 35 36llvm.func @tbaa1(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { 37 %0 = llvm.mlir.constant(1 : i8) : i8 38 llvm.store %0, %arg0 {tbaa = [#tbaa_tag_0]} : i8, !llvm.ptr 39 llvm.store %0, %arg1 {tbaa = [#tbaa_tag_1]} : i8, !llvm.ptr 40 llvm.return 41} 42 43// CHECK: llvm.func @tbaa1(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) { 44// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i8) : i8 45// CHECK: llvm.store %[[VAL_2]], %[[VAL_0]] {tbaa = [#[[$TAG_0]]]} : i8, !llvm.ptr 46// CHECK: llvm.store %[[VAL_2]], %[[VAL_1]] {tbaa = [#[[$TAG_1]]]} : i8, !llvm.ptr 47// CHECK: llvm.return 48// CHECK: } 49 50llvm.func @tbaa2(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { 51 %0 = llvm.mlir.constant(0 : i32) : i32 52 %1 = llvm.mlir.constant(1 : i32) : i32 53 %2 = llvm.getelementptr inbounds %arg1[%0, 1] : (!llvm.ptr, i32) -> !llvm.ptr, !llvm.struct<"struct.agg2_t", (i64, i64)> 54 %3 = llvm.load %2 {tbaa = [#tbaa_tag_2]} : !llvm.ptr -> i64 55 %4 = llvm.trunc %3 : i64 to i32 56 %5 = llvm.getelementptr inbounds %arg0[%0, 0] : (!llvm.ptr, i32) -> !llvm.ptr, !llvm.struct<"struct.agg1_t", (i32, i32)> 57 llvm.store %4, %5 {tbaa = [#tbaa_tag_3]} : i32, !llvm.ptr 58 llvm.return 59} 60 61// CHECK: llvm.func @tbaa2(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) { 62// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32 63// CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(1 : i32) : i32 64// CHECK: %[[VAL_4:.*]] = llvm.getelementptr inbounds %[[VAL_1]]{{\[}}%[[VAL_2]], 1] : (!llvm.ptr, i32) -> !llvm.ptr, !llvm.struct<"struct.agg2_t", (i64, i64)> 65// CHECK: %[[VAL_5:.*]] = llvm.load %[[VAL_4]] {tbaa = [#[[$TAG_2]]]} : !llvm.ptr -> i64 66// CHECK: %[[VAL_6:.*]] = llvm.trunc %[[VAL_5]] : i64 to i32 67// CHECK: %[[VAL_7:.*]] = llvm.getelementptr inbounds %[[VAL_0]]{{\[}}%[[VAL_2]], 0] : (!llvm.ptr, i32) -> !llvm.ptr, !llvm.struct<"struct.agg1_t", (i32, i32)> 68// CHECK: llvm.store %[[VAL_6]], %[[VAL_7]] {tbaa = [#[[$TAG_3]]]} : i32, !llvm.ptr 69// CHECK: llvm.return 70// CHECK: } 71 72llvm.func @tbaa3(%arg0: !llvm.ptr) { 73 %0 = llvm.mlir.constant(1 : i8) : i8 74 llvm.store %0, %arg0 {tbaa = [#tbaa_tag_0, #tbaa_tag_1]} : i8, !llvm.ptr 75 llvm.return 76} 77 78// CHECK: llvm.func @tbaa3(%[[VAL_0:.*]]: !llvm.ptr) { 79// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i8) : i8 80// CHECK: llvm.store %[[VAL_1]], %[[VAL_0]] {tbaa = [#[[$TAG_0]], #[[$TAG_1]]]} : i8, !llvm.ptr 81// CHECK: llvm.return 82// CHECK: } 83 84llvm.func @tbaa4(%arg0: !llvm.ptr) { 85 %0 = llvm.mlir.constant(1 : i8) : i8 86 llvm.store %0, %arg0 {tbaa = [#tbaa_tag_4]} : i8, !llvm.ptr 87 llvm.return 88} 89 90// CHECK: llvm.func @tbaa4(%[[VAL_0:.*]]: !llvm.ptr) { 91// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i8) : i8 92// CHECK: llvm.store %[[VAL_1]], %[[VAL_0]] {tbaa = [#[[$TAG_4]]]} : i8, !llvm.ptr 93// CHECK: llvm.return 94// CHECK: } 95