reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
;; RUN:  opt -S -stack-tagging %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() local_unnamed_addr #0  {
S0:
; CHECK-LABEL: S0:
; CHECK: %basetag = call i8* @llvm.aarch64.irg.sp(i64 0)
  %v = alloca i8, i32 48, align 8
; CHECK: %v.tag = call i8* @llvm.aarch64.tagp.p0i8(i8* %v, i8* %basetag, i64 0)
  %w = alloca i8, i32 48, align 16
; CHECK: %w.tag = call i8* @llvm.aarch64.tagp.p0i8(i8* %w, i8* %basetag, i64 1)

  %t0 = call i32 @g0() #1
  %b0 = icmp eq i32 %t0, 0
  br i1 %b0, label %S1, label %exit3

S1:
; CHECK-LABEL: S1:
  call void @llvm.lifetime.start.p0i8(i64 48, i8 * nonnull %v) #1
; CHECK: call void @llvm.aarch64.settag(i8* %v.tag, i64 48)
  call void @llvm.lifetime.start.p0i8(i64 48, i8 * nonnull %w) #1
; CHECK: call void @llvm.aarch64.settag(i8* %w.tag, i64 48)
  %t1 = call i32 @g1(i8 * nonnull %v, i8 * nonnull %w) #1
; CHECK: call i32 @g1
; CHECK-NOT: settag{{.*}}%v
; CHECK: call void @llvm.aarch64.settag(i8* %w, i64 48)
; CHECK-NOT: settag{{.*}}%v
  call void @llvm.lifetime.end.p0i8(i64 48, i8 * nonnull %w) #1
; CHECK: call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %w.tag)
  %b1 = icmp eq i32 %t1, 0
  br i1 %b1, label %S2, label %S3
; CHECK-NOT: settag

S2:
; CHECK-LABEL: S2:
  call void @z0() #1
  br label %exit1
; CHECK-NOT: settag

S3:
; CHECK-LABEL: S3:
  call void @llvm.lifetime.end.p0i8(i64 48, i8 * nonnull %v) #1
  tail call void @z1() #1
  br label %exit2
; CHECK-NOT: settag

exit1:
; CHECK-LABEL: exit1:
; CHECK: call void @llvm.aarch64.settag(i8* %v, i64 48)
  ret void

exit2:
; CHECK-LABEL: exit2:
; CHECK: call void @llvm.aarch64.settag(i8* %v, i64 48)
  ret void

exit3:
; CHECK-LABEL: exit3:
  call void @z2() #1
; CHECK-NOT: settag
  ret void
; CHECK:  ret void
}

declare i32 @g0() #0

declare i32 @g1(i8 *, i8 *) #0

declare void @z0() #0

declare void @z1() #0

declare void @z2() #0

declare void @llvm.lifetime.start.p0i8(i64 immarg, i8 * nocapture) #1

declare void @llvm.lifetime.end.p0i8(i64 immarg, i8 * nocapture) #1

attributes #0 = { sanitize_memtag "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="preserve-sign" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="true" "no-jump-tables"="false" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+mte,+neon,+v8.5a" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }