xref: /llvm-project/llvm/test/CodeGen/X86/stack-protector-musttail.ll (revision 0c5b0b50c22d215177f7cdacf533444665ffd864)
1; RUN: llc -mtriple=x86_64-linux-gnu -fast-isel %s -o - -start-before=stack-protector -stop-after=stack-protector  | FileCheck %s
2
3@var = global ptr null
4
5declare void @callee()
6
7define void @caller1() sspreq {
8; CHECK-LABEL: define void @caller1()
9; Prologue:
10; CHECK: @llvm.stackprotector
11
12; CHECK: [[GUARD:%.*]] = load volatile ptr, ptr
13; CHECK: [[TOKEN:%.*]] = load volatile ptr, ptr {{%.*}}
14; CHECK: [[TST:%.*]] = icmp eq ptr [[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 ptr %var, ptr @var
21  musttail call void @callee()
22  ret void
23}
24
25define void @justret() sspreq {
26; CHECK-LABEL: define void @justret()
27; Prologue:
28; CHECK: @llvm.stackprotector
29
30; CHECK: [[GUARD:%.*]] = load volatile ptr, ptr
31; CHECK: [[TOKEN:%.*]] = load volatile ptr, ptr {{%.*}}
32; CHECK: [[TST:%.*]] = icmp eq ptr [[GUARD]], [[TOKEN]]
33; CHECK: br i1 [[TST]]
34
35; CHECK: ret void
36  %var = alloca [2 x i64]
37  store ptr %var, ptr @var
38  br label %retblock
39
40retblock:
41  ret void
42}
43
44
45declare ptr @callee2()
46
47define ptr @caller2() sspreq {
48; CHECK-LABEL: define ptr @caller2()
49; Prologue:
50; CHECK: @llvm.stackprotector
51
52; CHECK: [[GUARD:%.*]] = load volatile ptr, ptr
53; CHECK: [[TOKEN:%.*]] = load volatile ptr, ptr {{%.*}}
54; CHECK: [[TST:%.*]] = icmp eq ptr [[GUARD]], [[TOKEN]]
55; CHECK: br i1 [[TST]]
56
57; CHECK: [[TMP:%.*]] = musttail call ptr @callee2()
58; CHECK-NEXT: ret ptr [[TMP]]
59
60  %var = alloca [2 x i64]
61  store ptr %var, ptr @var
62  %tmp = musttail call ptr @callee2()
63  ret ptr %tmp
64}
65
66define void @caller3() sspreq {
67; CHECK-LABEL: define void @caller3()
68; Prologue:
69; CHECK: @llvm.stackprotector
70
71; CHECK: [[GUARD:%.*]] = load volatile ptr, ptr
72; CHECK: [[TOKEN:%.*]] = load volatile ptr, ptr {{%.*}}
73; CHECK: [[TST:%.*]] = icmp eq ptr [[GUARD]], [[TOKEN]]
74; CHECK: br i1 [[TST]]
75
76; CHECK: tail call void @callee()
77; CHECK-NEXT: ret void
78  %var = alloca [2 x i64]
79  store ptr %var, ptr @var
80  tail call void @callee()
81  ret void
82}
83
84define ptr @caller4() sspreq {
85; CHECK-LABEL: define ptr @caller4()
86; Prologue:
87; CHECK: @llvm.stackprotector
88
89; CHECK: [[GUARD:%.*]] = load volatile ptr, ptr
90; CHECK: [[TOKEN:%.*]] = load volatile ptr, ptr {{%.*}}
91; CHECK: [[TST:%.*]] = icmp eq ptr [[GUARD]], [[TOKEN]]
92; CHECK: br i1 [[TST]]
93
94; CHECK: [[TMP:%.*]] = tail call ptr @callee2()
95; CHECK-NEXT: ret ptr [[TMP]]
96
97  %var = alloca [2 x i64]
98  store ptr %var, ptr @var
99  %tmp = tail call ptr @callee2()
100  ret ptr %tmp
101}
102