[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / speculation-hardening-sls.ll
bloba68d6f039939e658f95b0973788ff36dd9190eaf
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
4 define 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
14 entry:
15   %cmp = icmp sgt i32 %a, 0
16   br i1 %cmp, label %if.then, label %if.else
18 if.then:                                          ; preds = %entry
19   %div = sdiv i32 %a, %b
20   ret i32 %div
22 if.else:                                          ; preds = %entry
23   %div1 = sdiv i32 %b, %a
24   ret i32 %div1
27 @__const.indirect_branch.ptr = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@indirect_branch, %return), ptr blockaddress(@indirect_branch, %l2)], align 8
29 ; Function Attrs: norecurse nounwind readnone
30 define 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
41 entry:
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]
47 l2:                                               ; preds = %entry
48   br label %return
50 return:                                           ; preds = %entry, %l2
51   %retval.0 = phi i32 [ 1, %l2 ], [ 0, %entry ]
52   ret i32 %retval.0
55 define 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
66 entry:
67   callbr void asm sideeffect "jmp $0", "!i"()
68             to label %asm.fallthrough [label %d]
69      ; The asm goto above produces a direct branch:
71 asm.fallthrough:               ; preds = %entry
72   ret i32 0
74 d:                             ; preds = %asm.fallthrough, %entry
75   ret i32 1
78 define 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
88 declare dso_local void @foo()
90 define 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