1; RUN: llc -mattr=harden-sls-ret -mtriple=x86_64-unknown-unknown < %s | FileCheck %s -check-prefixes=CHECK,RET 2; RUN: llc -mattr=harden-sls-ijmp -mtriple=x86_64-unknown-unknown < %s | FileCheck %s -check-prefixes=CHECK,IJMP 3 4define dso_local i32 @double_return(i32 %a, i32 %b) local_unnamed_addr { 5; CHECK-LABEL: double_return: 6; CHECK: jle 7; CHECK-NOT: int3 8; CHECK: retq 9; RET-NEXT: int3 10; IJMP-NOT: int3 11; CHECK: retq 12; RET-NEXT: int3 13; IJMP-NOT: int3 14entry: 15 %cmp = icmp sgt i32 %a, 0 16 br i1 %cmp, label %if.then, label %if.else 17 18if.then: ; preds = %entry 19 %div = sdiv i32 %a, %b 20 ret i32 %div 21 22if.else: ; preds = %entry 23 %div1 = sdiv i32 %b, %a 24 ret i32 %div1 25} 26 27@__const.indirect_branch.ptr = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@indirect_branch, %return), ptr blockaddress(@indirect_branch, %l2)], align 8 28 29; Function Attrs: norecurse nounwind readnone 30define dso_local i32 @indirect_branch(i32 %a, i32 %b, i32 %i) { 31; CHECK-LABEL: indirect_branch: 32; CHECK: jmpq * 33; RET-NOT: int3 34; IJMP-NEXT: int3 35; CHECK: retq 36; RET-NEXT: int3 37; IJMP-NOT: int3 38; CHECK: retq 39; RET-NEXT: int3 40; IJMP-NOT: int3 41entry: 42 %idxprom = sext i32 %i to i64 43 %arrayidx = getelementptr inbounds [2 x ptr], ptr @__const.indirect_branch.ptr, i64 0, i64 %idxprom 44 %0 = load ptr, ptr %arrayidx, align 8 45 indirectbr ptr %0, [label %return, label %l2] 46 47l2: ; preds = %entry 48 br label %return 49 50return: ; preds = %entry, %l2 51 %retval.0 = phi i32 [ 1, %l2 ], [ 0, %entry ] 52 ret i32 %retval.0 53} 54 55define i32 @asmgoto() { 56; CHECK-LABEL: asmgoto: 57; CHECK: # %bb.0: # %entry 58; CHECK: jmp .L 59; CHECK-NOT: int3 60; CHECK: retq 61; RET-NEXT: int3 62; IJMP-NOT: int3 63; CHECK: retq 64; RET-NEXT: int3 65; IJMP-NOT: int3 66entry: 67 callbr void asm sideeffect "jmp $0", "!i"() 68 to label %asm.fallthrough [label %d] 69 ; The asm goto above produces a direct branch: 70 71asm.fallthrough: ; preds = %entry 72 ret i32 0 73 74d: ; preds = %asm.fallthrough, %entry 75 ret i32 1 76} 77 78define void @bar(ptr %0) { 79; CHECK-LABEL: bar: 80; CHECK: jmpq * 81; RET-NOT: int3 82; IJMP-NEXT: int3 83; CHECK-NOT: ret 84 tail call void %0() 85 ret void 86} 87 88declare dso_local void @foo() 89 90define dso_local void @bar2() { 91; CHECK-LABEL: bar2: 92; CHECK: jmp foo 93; CHECK-NOT: int3 94; CHECK-NOT: ret 95 tail call void @foo() 96 ret void 97} 98