1; RUN: llc -mtriple=arm64-apple-macosx -fast-isel %s -o - -start-before=stack-protector -stop-after=stack-protector  | FileCheck %s
2
3@var = global [2 x i64]* null
4
5declare void @callee()
6
7define void @caller1() ssp {
8; CHECK-LABEL: define void @caller1()
9; Prologue:
10; CHECK: @llvm.stackguard
11
12; CHECK: [[GUARD:%.*]] = call i8* @llvm.stackguard()
13; CHECK: [[TOKEN:%.*]] = load volatile i8*, i8** {{%.*}}
14; CHECK: [[TST:%.*]] = icmp eq i8* [[GUARD]], [[TOKEN]]
15; CHECK: br i1 [[TST]]
16
17; CHECK: musttail call void @callee()
18; CHECK-NEXT: ret void
19  %var = alloca [2 x i64]
20  store [2 x i64]* %var, [2 x i64]** @var
21  musttail call void @callee()
22  ret void
23}
24
25define void @justret() ssp {
26; CHECK-LABEL: define void @justret()
27; Prologue:
28; CHECK: @llvm.stackguard
29
30; CHECK: [[GUARD:%.*]] = call i8* @llvm.stackguard()
31; CHECK: [[TOKEN:%.*]] = load volatile i8*, i8** {{%.*}}
32; CHECK: [[TST:%.*]] = icmp eq i8* [[GUARD]], [[TOKEN]]
33; CHECK: br i1 [[TST]]
34
35; CHECK: ret void
36  %var = alloca [2 x i64]
37  store [2 x i64]* %var, [2 x i64]** @var
38  br label %retblock
39
40retblock:
41  ret void
42}
43
44
45declare i64* @callee2()
46
47define i8* @caller2() ssp {
48; CHECK-LABEL: define i8* @caller2()
49; Prologue:
50; CHECK: @llvm.stackguard
51
52; CHECK: [[GUARD:%.*]] = call i8* @llvm.stackguard()
53; CHECK: [[TOKEN:%.*]] = load volatile i8*, i8** {{%.*}}
54; CHECK: [[TST:%.*]] = icmp eq i8* [[GUARD]], [[TOKEN]]
55; CHECK: br i1 [[TST]]
56
57; CHECK: [[TMP:%.*]] = musttail call i64* @callee2()
58; CHECK-NEXT: [[RES:%.*]] = bitcast i64* [[TMP]] to i8*
59; CHECK-NEXT: ret i8* [[RES]]
60
61  %var = alloca [2 x i64]
62  store [2 x i64]* %var, [2 x i64]** @var
63  %tmp = musttail call i64* @callee2()
64  %res = bitcast i64* %tmp to i8*
65  ret i8* %res
66}
67