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