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