xref: /llvm-project/llvm/test/CodeGen/X86/speculation-hardening-sls.ll (revision 2a721374aef326d4668f750d341c86d1aa1a0309)
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