File: metadata-tbaa.ll

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (114 lines) | stat: -rw-r--r-- 4,254 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s

; CHECK-DAG: #[[R0:.*]] = #llvm.tbaa_root<id = "Simple C/C++ TBAA">
; CHECK-DAG: #[[D0:.*]] = #llvm.tbaa_type_desc<id = "scalar type", members = {<#[[R0]], 0>}>
; CHECK-DAG: #[[$T0:.*]] = #llvm.tbaa_tag<base_type = #[[D0]], access_type = #[[D0]], offset = 0>
; CHECK-DAG: #[[R1:.*]] = #llvm.tbaa_root<id = "Other language TBAA">
; CHECK-DAG: #[[D1:.*]] = #llvm.tbaa_type_desc<id = "other scalar type", members = {<#[[R1]], 0>}>
; CHECK-DAG: #[[$T1:.*]] = #llvm.tbaa_tag<base_type = #[[D1]], access_type = #[[D1]], offset = 0>

; CHECK-LABEL: llvm.func @tbaa1
; CHECK:         llvm.store %{{.*}}, %{{.*}} {
; CHECK-SAME:        tbaa = [#[[$T0]]]
; CHECK-SAME:    } : i8, !llvm.ptr
; CHECK:         llvm.store %{{.*}}, %{{.*}} {
; CHECK-SAME:        tbaa = [#[[$T1]]]
; CHECK-SAME:    } : i8, !llvm.ptr
define dso_local void @tbaa1(ptr %0, ptr %1) {
  store i8 1, ptr %0, align 4, !tbaa !0
  store i8 1, ptr %1, align 4, !tbaa !3
  ret void
}

!0 = !{!1, !1, i64 0}
!1 = !{!"scalar type", !2, i64 0}
!2 = !{!"Simple C/C++ TBAA"}

!3 = !{!4, !4, i64 0}
!4 = !{!"other scalar type", !5, i64 0}
!5 = !{!"Other language TBAA"}

; // -----

; CHECK-DAG: #[[R0:.*]] = #llvm.tbaa_root<id = "Simple C/C++ TBAA">
; CHECK-DAG: #[[$T0:.*]] = #llvm.tbaa_tag<base_type = #[[D2:.*]], access_type = #[[D1:.*]], offset = 8>
; CHECK-DAG: #[[D1]] = #llvm.tbaa_type_desc<id = "long long", members = {<#[[D0:.*]], 0>}>
; CHECK-DAG: #[[D0]] = #llvm.tbaa_type_desc<id = "omnipotent char", members = {<#[[R0]], 0>}>
; CHECK-DAG: #[[D2]] = #llvm.tbaa_type_desc<id = "agg2_t", members = {<#[[D1]], 0>, <#[[D1]], 8>}>
; CHECK-DAG: #[[$T1:.*]] = #llvm.tbaa_tag<base_type = #[[D4:.*]], access_type = #[[D3:.*]], offset = 0>
; CHECK-DAG: #[[D3]] = #llvm.tbaa_type_desc<id = "int", members = {<#[[D0]], 0>}>
; CHECK-DAG: #[[D4]] = #llvm.tbaa_type_desc<id = "agg1_t", members = {<#[[D3]], 0>, <#[[D3]], 4>}>

; CHECK-LABEL: llvm.func @tbaa2
; CHECK:         llvm.load %{{.*}} {
; CHECK-SAME:        tbaa = [#[[$T0]]]
; CHECK-SAME:    } : !llvm.ptr -> i64
; CHECK:         llvm.store %{{.*}}, %{{.*}} {
; CHECK-SAME:        tbaa = [#[[$T1]]]
; CHECK-SAME:    } : i32, !llvm.ptr
%struct.agg2_t = type { i64, i64 }
%struct.agg1_t = type { i32, i32 }

define dso_local void @tbaa2(ptr %0, ptr %1) {
  %3 = getelementptr inbounds %struct.agg2_t, ptr %1, i32 0, i32 1
  %4 = load i64, ptr %3, align 8, !tbaa !6
  %5 = trunc i64 %4 to i32
  %6 = getelementptr inbounds %struct.agg1_t, ptr %0, i32 0, i32 0
  store i32 %5, ptr %6, align 4, !tbaa !11
  ret void
}

!6 = !{!7, !8, i64 8}
!7 = !{!"agg2_t", !8, i64 0, !8, i64 8}
!8 = !{!"long long", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!12, !13, i64 0}
!12 = !{!"agg1_t", !13, i64 0, !13, i64 4}
!13 = !{!"int", !9, i64 0}

; // -----

; CHECK-LABEL: llvm.func @supported_ops
define void @supported_ops(ptr %arg1, float %arg2, i32 %arg3, i32 %arg4) {
  ; CHECK: llvm.load {{.*}}tbaa =
  %1 = load i32, ptr %arg1, !tbaa !0
  ; CHECK: llvm.store {{.*}}tbaa =
  store i32 %1, ptr %arg1, !tbaa !0
  ; CHECK: llvm.atomicrmw {{.*}}tbaa =
  %2 = atomicrmw fmax ptr %arg1, float %arg2 acquire, !tbaa !0
  ; CHECK: llvm.cmpxchg {{.*}}tbaa =
  %3 = cmpxchg ptr %arg1, i32 %arg3, i32 %arg4 monotonic seq_cst, !tbaa !0
  ; CHECK: "llvm.intr.memcpy"{{.*}}tbaa =
  call void @llvm.memcpy.p0.p0.i32(ptr %arg1, ptr %arg1, i32 4, i1 false), !tbaa !0
  ; CHECK: "llvm.intr.memset"{{.*}}tbaa =
  call void @llvm.memset.p0.i32(ptr %arg1, i8 42, i32 4, i1 false), !tbaa !0
  ; CHECK: llvm.call{{.*}}tbaa =
  call void @foo(ptr %arg1), !tbaa !0
  ret void
}

declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg)
declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)
declare void @foo(ptr %arg1)

!0 = !{!1, !1, i64 0}
!1 = !{!"scalar type", !2, i64 0}
!2 = !{!"Simple C/C++ TBAA"}

; // -----

; CHECK: #llvm.tbaa_root
; CHECK-NOT: <{{.*}}>
; CHECK: {{[[:space:]]}}

define void @nameless_root(ptr %arg1) {
  ; CHECK: llvm.load {{.*}}tbaa =
  %1 = load i32, ptr %arg1, !tbaa !0
  ret void
}

!0 = !{!1, !1, i64 0}
!1 = !{!"scalar type", !2, i64 0}
!2 = !{}