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