1; RUN: llc -mtriple=thumbv7-windows-msvc -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 11; CHECK: call void @__security_check_cookie 12 13; CHECK: musttail call void @callee() 14; CHECK-NEXT: ret void 15 %var = alloca [2 x i64] 16 store ptr %var, ptr @var 17 musttail call void @callee() 18 ret void 19} 20 21define void @justret() sspreq { 22; CHECK-LABEL: define void @justret() 23; Prologue: 24; CHECK: @llvm.stackguard 25 26; CHECK: call void @__security_check_cookie 27 28; CHECK: ret void 29 %var = alloca [2 x i64] 30 store ptr %var, ptr @var 31 br label %retblock 32 33retblock: 34 ret void 35} 36 37declare ptr @callee2() 38 39define ptr @caller2() sspreq { 40; CHECK-LABEL: define ptr @caller2() 41; Prologue: 42; CHECK: @llvm.stackguard 43 44; CHECK: call void @__security_check_cookie 45 46; CHECK: [[TMP:%.*]] = musttail call ptr @callee2() 47; CHECK-NEXT: ret ptr [[TMP]] 48 49 %var = alloca [2 x i64] 50 store ptr %var, ptr @var 51 %tmp = musttail call ptr @callee2() 52 ret ptr %tmp 53} 54 55define void @caller3() sspreq { 56; CHECK-LABEL: define void @caller3() 57; Prologue: 58 59; CHECK: call void @__security_check_cookie 60 61; CHECK: tail call void @callee() 62; CHECK-NEXT: ret void 63 %var = alloca [2 x i64] 64 store ptr %var, ptr @var 65 tail call void @callee() 66 ret void 67} 68 69define ptr @caller4() sspreq { 70; CHECK-LABEL: define ptr @caller4() 71; Prologue: 72; CHECK: @llvm.stackguard 73 74; CHECK: call void @__security_check_cookie 75 76; CHECK: [[TMP:%.*]] = tail call ptr @callee2() 77; CHECK-NEXT: ret ptr [[TMP]] 78 79 %var = alloca [2 x i64] 80 store ptr %var, ptr @var 81 %tmp = tail call ptr @callee2() 82 ret ptr %tmp 83} 84