blob: 36846b04c0d07ca0b410ffba4c47c47393596c7c [file] [log] [blame]
; RUN: opt -S -aarch64-stack-tagging -stack-tagging-use-stack-safety=0 %s -o - | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-arm-unknown-eabi"
define void @f(i1 %cond) local_unnamed_addr sanitize_memtag {
start:
; CHECK-LABEL: start:
%a = alloca i8, i32 48, align 8
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
br i1 %cond, label %next0, label %next1
next0:
; CHECK-LABEL: next0:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit0
exit0:
; CHECK-LABEL: exit0:
; CHECK-NOT: call void @llvm.aarch64.settag
ret void
next1:
; CHECK-LABEL: next1:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
exit1:
; CHECK-LABEL: exit1:
; CHECK-NOT: call void @llvm.aarch64.settag
ret void
}
define void @diamond(i1 %cond) local_unnamed_addr sanitize_memtag {
start:
; CHECK-LABEL: start:
%a = alloca i8, i32 48, align 8
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
br i1 %cond, label %next0, label %next1
next0:
; CHECK-LABEL: next0:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next1:
; CHECK-LABEL: next1:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
exit1:
; CHECK-LABEL: exit1:
; CHECK-NOT: call void @llvm.aarch64.settag
ret void
}
define void @diamond_nocover(i1 %cond) local_unnamed_addr sanitize_memtag {
start:
; CHECK-LABEL: start:
%a = alloca i8, i32 48, align 8
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
br i1 %cond, label %next0, label %next1
next0:
; CHECK-LABEL: next0:
; CHECK-NOT: llvm.lifetime.end
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next1:
; CHECK-LABEL: next1:
; CHECK-NOT: llvm.lifetime.end
br label %exit1
exit1:
; CHECK-LABEL: exit1:
; CHECK: call void @llvm.aarch64.settag
ret void
}
define void @diamond3(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
start:
; CHECK-LABEL: start:
%a = alloca i8, i32 48, align 8
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
br i1 %cond, label %next0, label %start1
start1:
br i1 %cond1, label %next1, label %next2
next0:
; CHECK-LABEL: next0:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next1:
; CHECK-LABEL: next1:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next2:
; CHECK-LABEL: next2:
; CHECK: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
exit1:
; CHECK-LABEL: exit1:
; CHECK-NOT: call void @llvm.aarch64.settag
ret void
}
define void @diamond3_nocover(i1 %cond, i1 %cond1) local_unnamed_addr sanitize_memtag {
start:
; CHECK-LABEL: start:
%a = alloca i8, i32 48, align 8
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %a)
; CHECK: call void @llvm.aarch64.settag(i8* %a.tag, i64 48)
br i1 %cond, label %next0, label %start1
start1:
br i1 %cond1, label %next1, label %next2
next0:
; CHECK-LABEL: next0:
; CHECK-NOT: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next1:
; CHECK-LABEL: next1:
; CHECK-NOT: call void @llvm.aarch64.settag
call void @llvm.lifetime.end.p0i8(i64 40, i8* nonnull %a)
br label %exit1
next2:
; CHECK-LABEL: next2:
; CHECK-NOT: call void @llvm.aarch64.settag
br label %exit1
exit1:
; CHECK-LABEL: exit1:
; CHECK: call void @llvm.aarch64.settag
ret void
}
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)