xref: /llvm-project/llvm/test/CodeGen/AArch64/stack-tagging-split-lifetime.ll (revision d39b4ce3ce8a3c256e01bdec2b140777a332a633)
1; RUN: opt -S -aarch64-stack-tagging -stack-tagging-use-stack-safety=0 %s -o - | FileCheck %s
2
3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4target triple = "aarch64"
5
6declare void @use8(ptr)
7
8define  void @f(i1 %cond) local_unnamed_addr sanitize_memtag {
9start:
10; CHECK-LABEL: start:
11  %a = alloca i8, i32 48, align 8
12  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %a)
13  call void @use8(ptr %a)
14; CHECK: call void @llvm.aarch64.settag(ptr %a.tag, i64 48)
15  br i1 %cond, label %next0, label %next1
16
17next0:
18; CHECK-LABEL: next0:
19; CHECK: call void @llvm.aarch64.settag
20  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
21  br label %exit0
22
23exit0:
24; CHECK-LABEL: exit0:
25; CHECK-NOT: call void @llvm.aarch64.settag
26  ret void
27
28next1:
29; CHECK-LABEL: next1:
30; CHECK: call void @llvm.aarch64.settag
31  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
32  br label %exit1
33
34exit1:
35; CHECK-LABEL: exit1:
36; CHECK-NOT: call void @llvm.aarch64.settag
37  ret void
38}
39
40define  void @diamond(i1 %cond) local_unnamed_addr sanitize_memtag {
41start:
42; CHECK-LABEL: start:
43  %a = alloca i8, i32 48, align 8
44  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %a)
45  call void @use8(ptr %a)
46; CHECK: call void @llvm.aarch64.settag(ptr %a.tag, i64 48)
47  br i1 %cond, label %next0, label %next1
48
49next0:
50; CHECK-LABEL: next0:
51; CHECK: call void @llvm.aarch64.settag
52  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
53  br label %exit1
54
55next1:
56; CHECK-LABEL: next1:
57; CHECK: call void @llvm.aarch64.settag
58  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
59  br label %exit1
60
61exit1:
62; CHECK-LABEL: exit1:
63; CHECK-NOT: call void @llvm.aarch64.settag
64  ret void
65}
66
67define  void @diamond_nocover(i1 %cond) local_unnamed_addr sanitize_memtag {
68start:
69; CHECK-LABEL: start:
70  %a = alloca i8, i32 48, align 8
71  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %a)
72  call void @use8(ptr %a)
73; CHECK: call void @llvm.aarch64.settag(ptr %a.tag, i64 48)
74  br i1 %cond, label %next0, label %next1
75
76next0:
77; CHECK-LABEL: next0:
78; CHECK-NOT: llvm.lifetime.end
79  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
80  br label %exit1
81
82next1:
83; CHECK-LABEL: next1:
84; CHECK-NOT: llvm.lifetime.end
85  br label %exit1
86
87exit1:
88; CHECK-LABEL: exit1:
89; CHECK: call void @llvm.aarch64.settag
90  ret void
91}
92
93define  void @diamond3(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
94start:
95; CHECK-LABEL: start:
96  %a = alloca i8, i32 48, align 8
97  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %a)
98  call void @use8(ptr %a)
99; CHECK: call void @llvm.aarch64.settag(ptr %a.tag, i64 48)
100  br i1 %cond, label %next0, label %start1
101
102start1:
103  br i1 %cond1, label %next1, label %next2
104
105next0:
106; CHECK-LABEL: next0:
107; CHECK: call void @llvm.aarch64.settag
108  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
109  br label %exit1
110
111next1:
112; CHECK-LABEL: next1:
113; CHECK: call void @llvm.aarch64.settag
114  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
115  br label %exit1
116
117next2:
118; CHECK-LABEL: next2:
119; CHECK: call void @llvm.aarch64.settag
120  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
121  br label %exit1
122
123exit1:
124; CHECK-LABEL: exit1:
125; CHECK-NOT: call void @llvm.aarch64.settag
126  ret void
127}
128
129define  void @diamond3_nocover(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
130start:
131; CHECK-LABEL: start:
132  %a = alloca i8, i32 48, align 8
133  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %a)
134  call void @use8(ptr %a)
135; CHECK: call void @llvm.aarch64.settag(ptr %a.tag, i64 48)
136  br i1 %cond, label %next0, label %start1
137
138start1:
139  br i1 %cond1, label %next1, label %next2
140
141next0:
142; CHECK-LABEL: next0:
143; CHECK-NOT: call void @llvm.aarch64.settag
144  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
145  br label %exit1
146
147next1:
148; CHECK-LABEL: next1:
149; CHECK-NOT: call void @llvm.aarch64.settag
150  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %a)
151  br label %exit1
152
153next2:
154; CHECK-LABEL: next2:
155; CHECK-NOT: call void @llvm.aarch64.settag
156  br label %exit1
157
158exit1:
159; CHECK-LABEL: exit1:
160; CHECK: call void @llvm.aarch64.settag
161  ret void
162}
163
164declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
165declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
166