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-arm-unknown-eabi"
5
6define  void @f(i1 %cond) local_unnamed_addr sanitize_memtag {
7start:
8; CHECK-LABEL: start:
9  %a = alloca i8, i32 48, align 8
10  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
11; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
12  br i1 %cond, label %next0, label %next1
13
14next0:
15; CHECK-LABEL: next0:
16; CHECK: call void @llvm.aarch64.settag
17  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
18  br label %exit0
19
20exit0:
21; CHECK-LABEL: exit0:
22; CHECK-NOT: call void @llvm.aarch64.settag
23  ret void
24
25next1:
26; CHECK-LABEL: next1:
27; CHECK: call void @llvm.aarch64.settag
28  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
29  br label %exit1
30
31exit1:
32; CHECK-LABEL: exit1:
33; CHECK-NOT: call void @llvm.aarch64.settag
34  ret void
35}
36
37define  void @diamond(i1 %cond) local_unnamed_addr sanitize_memtag {
38start:
39; CHECK-LABEL: start:
40  %a = alloca i8, i32 48, align 8
41  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
42; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
43  br i1 %cond, label %next0, label %next1
44
45next0:
46; CHECK-LABEL: next0:
47; CHECK: call void @llvm.aarch64.settag
48  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
49  br label %exit1
50
51next1:
52; CHECK-LABEL: next1:
53; CHECK: call void @llvm.aarch64.settag
54  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
55  br label %exit1
56
57exit1:
58; CHECK-LABEL: exit1:
59; CHECK-NOT: call void @llvm.aarch64.settag
60  ret void
61}
62
63define  void @diamond_nocover(i1 %cond) local_unnamed_addr sanitize_memtag {
64start:
65; CHECK-LABEL: start:
66  %a = alloca i8, i32 48, align 8
67  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
68; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
69  br i1 %cond, label %next0, label %next1
70
71next0:
72; CHECK-LABEL: next0:
73; CHECK-NOT: llvm.lifetime.end
74  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
75  br label %exit1
76
77next1:
78; CHECK-LABEL: next1:
79; CHECK-NOT: llvm.lifetime.end
80  br label %exit1
81
82exit1:
83; CHECK-LABEL: exit1:
84; CHECK: call void @llvm.aarch64.settag
85  ret void
86}
87
88define  void @diamond3(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
89start:
90; CHECK-LABEL: start:
91  %a = alloca i8, i32 48, align 8
92  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
93; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
94  br i1 %cond, label %next0, label %start1
95
96start1:
97  br i1 %cond1, label %next1, label %next2
98
99next0:
100; CHECK-LABEL: next0:
101; CHECK: call void @llvm.aarch64.settag
102  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
103  br label %exit1
104
105next1:
106; CHECK-LABEL: next1:
107; CHECK: call void @llvm.aarch64.settag
108  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
109  br label %exit1
110
111next2:
112; CHECK-LABEL: next2:
113; CHECK: call void @llvm.aarch64.settag
114  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
115  br label %exit1
116
117exit1:
118; CHECK-LABEL: exit1:
119; CHECK-NOT: call void @llvm.aarch64.settag
120  ret void
121}
122
123define  void @diamond3_nocover(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
124start:
125; CHECK-LABEL: start:
126  %a = alloca i8, i32 48, align 8
127  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
128; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
129  br i1 %cond, label %next0, label %start1
130
131start1:
132  br i1 %cond1, label %next1, label %next2
133
134next0:
135; CHECK-LABEL: next0:
136; CHECK-NOT: call void @llvm.aarch64.settag
137  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
138  br label %exit1
139
140next1:
141; CHECK-LABEL: next1:
142; CHECK-NOT: call void @llvm.aarch64.settag
143  call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
144  br label %exit1
145
146next2:
147; CHECK-LABEL: next2:
148; CHECK-NOT: call void @llvm.aarch64.settag
149  br label %exit1
150
151exit1:
152; CHECK-LABEL: exit1:
153; CHECK: call void @llvm.aarch64.settag
154  ret void
155}
156
157declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
158declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)
159