1; This tests the order in which functions are outlined in MachineOutliner 2; There are TWO key OutlinedFunction in FunctionList 3; 4; ===================== First One ===================== 5; ``` 6; mov w0, #1 7; mov w1, #2 8; mov w2, #3 9; mov w3, #4 10; mov w4, #5 11; ``` 12; It has: 13; - `SequenceSize=20` and `OccurrenceCount=6` 14; - each Candidate has `CallOverhead=12` and `FrameOverhead=4` 15; - `NotOutlinedCost=20*6=120` and `OutliningCost=12*6+20+4=96` 16; - `Benefit=120-96=24` and `Priority=120/96=1.25` 17; 18; ===================== Second One ===================== 19; ``` 20; mov w6, #6 21; mov w7, #7 22; b 23; ``` 24; It has: 25; - `SequenceSize=12` and `OccurrenceCount=4` 26; - each Candidate has `CallOverhead=4` and `FrameOverhead=0` 27; - `NotOutlinedCost=12*4=48` and `OutliningCost=4*4+12+0=28` 28; - `Benefit=48-28=20` and `Priority=48/28=1.71` 29; 30; Note that the first one has higher benefit, but lower priority. 31; Hence, when outlining per priority, the second one will be outlined first. 32 33; RUN: llc %s -enable-machine-outliner=always -filetype=obj -o %t 34; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-SORT-BY-PRIORITY 35 36; RUN: llc %s -enable-machine-outliner=always -outliner-benefit-threshold=22 -filetype=obj -o %t 37; RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=CHECK-THRESHOLD 38 39 40target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 41target triple = "arm64-apple-macosx14.0.0" 42 43declare i32 @_Z3fooiiii(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) 44 45define i32 @_Z2f1v() minsize { 46 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 11, i32 noundef 6, i32 noundef 7) 47 ret i32 %1 48} 49 50define i32 @_Z2f2v() minsize { 51 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 12, i32 noundef 6, i32 noundef 7) 52 ret i32 %1 53} 54 55define i32 @_Z2f3v() minsize { 56 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 13, i32 noundef 6, i32 noundef 7) 57 ret i32 %1 58} 59 60define i32 @_Z2f4v() minsize { 61 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 14, i32 noundef 6, i32 noundef 7) 62 ret i32 %1 63} 64 65define i32 @_Z2f5v() minsize { 66 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 15, i32 noundef 8, i32 noundef 9) 67 ret i32 %1 68} 69 70define i32 @_Z2f6v() minsize { 71 %1 = tail call i32 @_Z3fooiiii(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, i32 noundef 16, i32 noundef 9, i32 noundef 8) 72 ret i32 %1 73} 74 75; CHECK-SORT-BY-PRIORITY: <_OUTLINED_FUNCTION_0>: 76; CHECK-SORT-BY-PRIORITY-NEXT: mov w6, #0x6 77; CHECK-SORT-BY-PRIORITY-NEXT: mov w7, #0x7 78; CHECK-SORT-BY-PRIORITY-NEXT: b 79 80; CHECK-SORT-BY-PRIORITY: <_OUTLINED_FUNCTION_1>: 81; CHECK-SORT-BY-PRIORITY-NEXT: mov w0, #0x1 82; CHECK-SORT-BY-PRIORITY-NEXT: mov w1, #0x2 83; CHECK-SORT-BY-PRIORITY-NEXT: mov w2, #0x3 84; CHECK-SORT-BY-PRIORITY-NEXT: mov w3, #0x4 85; CHECK-SORT-BY-PRIORITY-NEXT: mov w4, #0x5 86; CHECK-SORT-BY-PRIORITY-NEXT: ret 87 88; CHECK-THRESHOLD: <_OUTLINED_FUNCTION_0>: 89; CHECK-THRESHOLD-NEXT: mov w0, #0x1 90; CHECK-THRESHOLD-NEXT: mov w1, #0x2 91; CHECK-THRESHOLD-NEXT: mov w2, #0x3 92; CHECK-THRESHOLD-NEXT: mov w3, #0x4 93; CHECK-THRESHOLD-NEXT: mov w4, #0x5 94; CHECK-THRESHOLD-NEXT: ret 95 96; CHECK-THRESHOLD-NOT: <_OUTLINED_FUNCTION_1>: 97