xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-outliner-patchable.ll (revision 80df56e03b0455382cec51557bfc9f099d5c0a6f)
1; RUN: llc < %s -verify-machineinstrs -enable-machine-outliner | FileCheck %s
2
3target triple = "riscv64-unknown-linux-gnu"
4
5declare void @foo(i32, i32, i32, i32) minsize
6
7;; TargetOpcode::FENTRY_CALL at the start of the function expands to a __fentry__
8;; call which must be present. Don't outline it.
9define void @fentry0(i1 %a) nounwind "fentry-call"="true" {
10; CHECK-LABEL: fentry0:
11; CHECK-NEXT:  # %bb.0:
12; CHECK-NEXT:    # FEntry call
13; CHECK:       # %bb.1:
14; CHECK-NEXT:    call t0, OUTLINED_FUNCTION_[[BB1:[0-9]+]]
15; CHECK-NEXT:    call foo
16; CHECK-LABEL: .LBB0_2:
17; CHECK-NEXT:    call	t0, OUTLINED_FUNCTION_[[BB2:[0-9]+]]
18; CHECK-NEXT:    call	foo
19entry:
20  br i1 %a, label %if.then, label %if.end
21if.then:
22  call void @foo(i32 1, i32 2, i32 3, i32 4)
23  br label %if.end
24if.end:
25  call void @foo(i32 5, i32 6, i32 7, i32 8)
26  ret void
27}
28
29define void @fentry1(i1 %a) nounwind "fentry-call"="true" {
30; CHECK-LABEL: fentry1:
31; CHECK-NEXT:  # %bb.0:
32; CHECK-NEXT:    # FEntry call
33; CHECK:       # %bb.1:
34; CHECK-NEXT:    call t0, OUTLINED_FUNCTION_[[BB1:[0-9]+]]
35; CHECK-NEXT:    call foo
36; CHECK-LABEL: .LBB1_2:
37; CHECK-NEXT:    call	t0, OUTLINED_FUNCTION_[[BB2:[0-9]+]]
38; CHECK-NEXT:    call	foo
39entry:
40  br i1 %a, label %if.then, label %if.end
41if.then:
42  call void @foo(i32 1, i32 2, i32 3, i32 4)
43  br label %if.end
44if.end:
45  call void @foo(i32 5, i32 6, i32 7, i32 8)
46  ret void
47}
48
49;; TargetOpcode::PATCHABLE_FUNCTION_ENTER at the start of the function expands to
50;; NOPs which must be present. Don't outline them.
51define void @patchable0(i1 %a) nounwind "patchable-function-entry"="2" {
52; CHECK-LABEL: patchable0:
53; CHECK-NEXT:  .Lfunc_begin0:
54; CHECK-NEXT:  # %bb.0:
55; CHECK-NEXT:    nop
56; CHECK-NEXT:    nop
57; CHECK:       # %bb.1:
58; CHECK-NEXT:    call t0, OUTLINED_FUNCTION_[[BB1:[0-9]+]]
59; CHECK-NEXT:    call foo
60; CHECK-LABEL: .LBB2_2:
61; CHECK-NEXT:    call	t0, OUTLINED_FUNCTION_[[BB2:[0-9]+]]
62; CHECK-NEXT:    call	foo
63entry:
64  br i1 %a, label %if.then, label %if.end
65if.then:
66  call void @foo(i32 1, i32 2, i32 3, i32 4)
67  br label %if.end
68if.end:
69  call void @foo(i32 5, i32 6, i32 7, i32 8)
70  ret void
71}
72
73define void @patchable1(i1 %a) nounwind "patchable-function-entry"="2" {
74; CHECK-LABEL: patchable1:
75; CHECK-NEXT:  .Lfunc_begin1:
76; CHECK-NEXT:  # %bb.0:
77; CHECK-NEXT:    nop
78; CHECK-NEXT:    nop
79; CHECK:       # %bb.1:
80; CHECK-NEXT:    call t0, OUTLINED_FUNCTION_[[BB1:[0-9]+]]
81; CHECK-NEXT:    call foo
82; CHECK-LABEL: .LBB3_2:
83; CHECK-NEXT:    call	t0, OUTLINED_FUNCTION_[[BB2:[0-9]+]]
84; CHECK-NEXT:    call	foo
85entry:
86  br i1 %a, label %if.then, label %if.end
87if.then:
88  call void @foo(i32 1, i32 2, i32 3, i32 4)
89  br label %if.end
90if.end:
91  call void @foo(i32 5, i32 6, i32 7, i32 8)
92  ret void
93}
94