1; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown < %s | FileCheck %s
2
3define dso_local void @one_instruction() #0 {
4; CHECK-LABEL: one_instruction:
5entry:
6  ret void
7; CHECK-NOT:   retq
8; CHECK:       popq %[[x:[^ ]*]]
9; CHECK-NEXT:  lfence
10; CHECK-NEXT:  jmpq *%[[x]]
11}
12
13; Function Attrs: noinline nounwind optnone uwtable
14define dso_local i32 @ordinary_function(i32 %x, i32 %y) #0 {
15; CHECK-LABEL: ordinary_function:
16entry:
17  %x.addr = alloca i32, align 4
18  %y.addr = alloca i32, align 4
19  store i32 %x, i32* %x.addr, align 4
20  store i32 %y, i32* %y.addr, align 4
21  %0 = load i32, i32* %x.addr, align 4
22  %1 = load i32, i32* %y.addr, align 4
23  %add = add nsw i32 %0, %1
24  ret i32 %add
25; CHECK-NOT:  retq
26; CHECK:      popq %[[x:[^ ]*]]
27; CHECK-NEXT: lfence
28; CHECK-NEXT: jmpq *%[[x]]
29}
30
31; Function Attrs: noinline nounwind optnone uwtable
32define dso_local i32 @no_caller_saved_registers_function(i32 %x, i32 %y) #1 {
33; CHECK-LABEL: no_caller_saved_registers_function:
34entry:
35  %x.addr = alloca i32, align 4
36  %y.addr = alloca i32, align 4
37  store i32 %x, i32* %x.addr, align 4
38  store i32 %y, i32* %y.addr, align 4
39  %0 = load i32, i32* %x.addr, align 4
40  %1 = load i32, i32* %y.addr, align 4
41  %add = add nsw i32 %0, %1
42  ret i32 %add
43; CHECK-NOT:  retq
44; CHECK:      popq %rcx
45; CHECK-NEXT: lfence
46; CHECK-NEXT: jmpq *%rcx
47}
48
49; Function Attrs: noinline nounwind optnone uwtable
50define dso_local preserve_mostcc void @preserve_most() #0 {
51; CHECK-LABEL: preserve_most:
52entry:
53  ret void
54; CHECK-NOT:  retq
55; CHECK:      popq %rax
56; CHECK-NEXT: lfence
57; CHECK-NEXT: jmpq *%rax
58}
59
60; Function Attrs: noinline nounwind optnone uwtable
61define dso_local preserve_allcc void @preserve_all() #0 {
62; CHECK-LABEL: preserve_all:
63entry:
64  ret void
65; CHECK-NOT:  retq
66; CHECK:      popq %rax
67; CHECK-NEXT: lfence
68; CHECK-NEXT: jmpq *%rax
69}
70
71define { i64, i128 } @ret_i64_i128() #0 {
72; CHECK-LABEL: ret_i64_i128:
73  ret { i64, i128 } { i64 1, i128 36893488147419103235 }
74; CHECK-NOT:  retq
75; CHECK:      popq %rsi
76; CHECK-NEXT: lfence
77; CHECK-NEXT: jmpq *%rsi
78}
79
80attributes #0 = { "target-features"="+lvi-cfi" }
81attributes #1 = { "no_caller_saved_registers" "target-features"="+lvi-cfi" }
82