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