xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-outliner-leaf-descendants.ll (revision 80df56e03b0455382cec51557bfc9f099d5c0a6f)
1229abcd4SAdityaK; This test is mainly for the -outliner-leaf-descendants flag for MachineOutliner.
2229abcd4SAdityaK;
3229abcd4SAdityaK; ===================== -outliner-leaf-descendants=false =====================
4229abcd4SAdityaK; MachineOutliner finds THREE key `OutlinedFunction` and outlines them. They are:
5229abcd4SAdityaK;   ```
6229abcd4SAdityaK;     mov     w0, #1
7229abcd4SAdityaK;     mov     w1, #2
8229abcd4SAdityaK;     mov     w2, #3
9229abcd4SAdityaK;     mov     w3, #4
10229abcd4SAdityaK;     mov     w4, #5
11229abcd4SAdityaK;     mov     w5, #6 or #7 or #8
12229abcd4SAdityaK;     b
13229abcd4SAdityaK;   ```
14229abcd4SAdityaK; Each has:
15229abcd4SAdityaK;   - `SequenceSize=28` and `OccurrenceCount=2`
16229abcd4SAdityaK;   - each Candidate has `CallOverhead=4` and `FrameOverhead=0`
17229abcd4SAdityaK;   - `NotOutlinedCost=28*2=56` and `OutliningCost=4*2+28+0=36`
18229abcd4SAdityaK;   - `Benefit=56-36=20` and `Priority=56/36=1.56`
19229abcd4SAdityaK;
20229abcd4SAdityaK; ===================== -outliner-leaf-descendants=true =====================
21229abcd4SAdityaK; MachineOutliner finds a FOURTH key `OutlinedFunction`, which is:
22229abcd4SAdityaK;   ```
23229abcd4SAdityaK;   mov     w0, #1
24229abcd4SAdityaK;   mov     w1, #2
25229abcd4SAdityaK;   mov     w2, #3
26229abcd4SAdityaK;   mov     w3, #4
27229abcd4SAdityaK;   mov     w4, #5
28229abcd4SAdityaK;   ```
29229abcd4SAdityaK; This corresponds to an internal node that has ZERO leaf children, but SIX leaf descendants.
30229abcd4SAdityaK; It has:
31229abcd4SAdityaK;   - `SequenceSize=20` and `OccurrenceCount=6`
32229abcd4SAdityaK;   - each Candidate has `CallOverhead=12` and `FrameOverhead=4`
33229abcd4SAdityaK;   - `NotOutlinedCost=20*6=120` and `OutliningCost=12*6+20+4=96`
34229abcd4SAdityaK;   - `Benefit=120-96=24` and `Priority=120/96=1.25`
35229abcd4SAdityaK;
36229abcd4SAdityaK; The FOURTH `OutlinedFunction` has lower _priority_ compared to the first THREE `OutlinedFunction`.
37229abcd4SAdityaK; Hence, we use `-outliner-benefit-threshold=22` to check if the FOURTH `OutlinedFunction` is identified.
38229abcd4SAdityaK
39229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=false -mattr=+m -mtriple=riscv64 -filetype=obj -o %t
40229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-BASELINE
41229abcd4SAdityaK
42229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=false -mattr=+m -mtriple=riscv64 -outliner-benefit-threshold=22 -filetype=obj -o %t
43229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-NO-CANDIDATE
44229abcd4SAdityaK
45229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=false -mattr=+m -mtriple=riscv32 -filetype=obj -o %t
46229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-BASELINE
47229abcd4SAdityaK
48229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=false -mattr=+m -mtriple=riscv32 -outliner-benefit-threshold=22 -filetype=obj -o %t
49229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-NO-CANDIDATE
50229abcd4SAdityaK
51229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=true -mattr=+m -mtriple=riscv64 -filetype=obj -o %t
52229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-LEAF-DESCENDANTS
53229abcd4SAdityaK
54229abcd4SAdityaK; RUN: llc %s -enable-machine-outliner=always -outliner-leaf-descendants=true -mattr=+m -mtriple=riscv64 -outliner-benefit-threshold=22 -filetype=obj -o %t
55229abcd4SAdityaK; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-LEAF-DESCENDANTS
56229abcd4SAdityaK
57229abcd4SAdityaK
58229abcd4SAdityaKdeclare i32 @_Z3fooiiii(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef)
59229abcd4SAdityaK
60229abcd4SAdityaKdefine i32 @_Z2f1v() minsize {
61229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 6)
62229abcd4SAdityaK  ret i32 %1
63229abcd4SAdityaK}
64229abcd4SAdityaK
65229abcd4SAdityaKdefine i32 @_Z2f2v() minsize {
66229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 6)
67229abcd4SAdityaK  ret i32 %1
68229abcd4SAdityaK}
69229abcd4SAdityaK
70229abcd4SAdityaKdefine i32 @_Z2f3v() minsize {
71229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 7)
72229abcd4SAdityaK  ret i32 %1
73229abcd4SAdityaK}
74229abcd4SAdityaK
75229abcd4SAdityaKdefine i32 @_Z2f4v() minsize {
76229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 7)
77229abcd4SAdityaK  ret i32 %1
78229abcd4SAdityaK}
79229abcd4SAdityaK
80229abcd4SAdityaKdefine i32 @_Z2f5v() minsize {
81229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 8)
82229abcd4SAdityaK  ret i32 %1
83229abcd4SAdityaK}
84229abcd4SAdityaK
85229abcd4SAdityaKdefine i32 @_Z2f6v() minsize {
86229abcd4SAdityaK  %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 8)
87229abcd4SAdityaK  ret i32 %1
88229abcd4SAdityaK}
89229abcd4SAdityaK
90229abcd4SAdityaK; CHECK-BASELINE: <OUTLINED_FUNCTION_0>:
91229abcd4SAdityaK; CHECK-BASELINE-NEXT: 	li	a0, 0x1
92229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a1, 0x2
93229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a2, 0x3
94229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a3, 0x4
95229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a4, 0x5
96229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a5, 0x6
97*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	auipc	t1, 0x0
98*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	jr	t1
99229abcd4SAdityaK
100229abcd4SAdityaK; CHECK-BASELINE: <OUTLINED_FUNCTION_1>:
101229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a0, 0x1
102229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a1, 0x2
103229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a2, 0x3
104229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a3, 0x4
105229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a4, 0x5
106*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	li	a5, 0x8
107*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	auipc	t1, 0x0
108*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	jr	t1
109229abcd4SAdityaK
110229abcd4SAdityaK; CHECK-BASELINE: <OUTLINED_FUNCTION_2>:
111229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a0, 0x1
112229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a1, 0x2
113229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a2, 0x3
114229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a3, 0x4
115229abcd4SAdityaK; CHECK-BASELINE-NEXT:	li	a4, 0x5
116*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	li	a5, 0x7
117*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	auipc	t1, 0x0
118*80df56e0SMark Goncharov; CHECK-BASELINE-NEXT:	jr	t1
119229abcd4SAdityaK
120229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS: <OUTLINED_FUNCTION_0>:
121229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	li	a0, 0x1
122229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	li	a1, 0x2
123229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	li	a2, 0x3
124229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	li	a3, 0x4
125229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	li	a4, 0x5
126229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NEXT:	jr	t0
127229abcd4SAdityaK
128229abcd4SAdityaK; CHECK-LEAF-DESCENDANTS-NOT: <OUTLINED_FUNCTION_1>:
129229abcd4SAdityaK
130229abcd4SAdityaK; CHECK-NO-CANDIDATE-NOT: <OUTLINED_FUNCTION_0>:
131