1 ; RUN: llc %s -enable-machine-outliner -mtriple=aarch64-unknown-unknown -pass-remarks=machine-outliner -pass-remarks-missed=machine-outliner -o /dev/null 2>&1 | FileCheck %s
2 ; CHECK: <unknown>:0:0:
3 ; CHECK-SAME: Did not outline 2 instructions from 2 locations.
4 ; CHECK-SAME: Bytes from outlining all occurrences (16) >=
5 ; CHECK-SAME: Unoutlined instruction bytes (16)
6 ; CHECK-SAME: (Also found at: <UNKNOWN LOCATION>)
7 ; CHECK: remark: <unknown>:0:0: Saved 48 bytes by outlining 14 instructions
8 ; CHECK-SAME: from 2 locations. (Found at: <UNKNOWN LOCATION>,
9 ; CHECK-SAME: <UNKNOWN LOCATION>)
10 ; RUN: llc %s -enable-machine-outliner -mtriple=aarch64-unknown-unknown -o /dev/null -pass-remarks-missed=machine-outliner -pass-remarks-output=%t.yaml
11 ; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
13 ; For the YAML case, the function we pick depends on the order of the candidate
16 ; YAML-NEXT: Pass: machine-outliner
17 ; YAML-NEXT: Name: NotOutliningCheaper
18 ; YAML-NEXT: Function:
20 ; YAML-NEXT: - String: 'Did not outline '
21 ; YAML-NEXT: - Length: '2'
22 ; YAML-NEXT: - String: ' instructions'
23 ; YAML-NEXT: - String: ' from '
24 ; YAML-NEXT: - NumOccurrences: '2'
25 ; YAML-NEXT: - String: ' locations.'
26 ; YAML-NEXT: - String: ' Bytes from outlining all occurrences ('
27 ; YAML-NEXT: - OutliningCost: '16'
28 ; YAML-NEXT: - String: ')'
29 ; YAML-NEXT: - String: ' >= Unoutlined instruction bytes ('
30 ; YAML-NEXT: - NotOutliningCost: '16'
31 ; YAML-NEXT: - String: ')'
32 ; YAML-NEXT: - String: ' (Also found at: '
33 ; YAML-NEXT: - OtherStartLoc1: '<UNKNOWN LOCATION>'
34 ; YAML-NEXT: - String: ')'
36 ; YAML-NEXT: Pass: machine-outliner
37 ; YAML-NEXT: Name: OutlinedFunction
38 ; YAML-NEXT: Function: OUTLINED_FUNCTION_0
40 ; YAML-NEXT: - String: 'Saved '
41 ; YAML-NEXT: - OutliningBenefit: '48'
42 ; YAML-NEXT: - String: ' bytes by '
43 ; YAML-NEXT: - String: 'outlining '
44 ; YAML-NEXT: - Length: '14'
45 ; YAML-NEXT: - String: ' instructions '
46 ; YAML-NEXT: - String: 'from '
47 ; YAML-NEXT: - NumOccurrences: '2'
48 ; YAML-NEXT: - String: ' locations. '
49 ; YAML-NEXT: - String: '(Found at: '
50 ; YAML-NEXT: - StartLoc0: '<UNKNOWN LOCATION>'
51 ; YAML-NEXT: - String: ', '
52 ; YAML-NEXT: - StartLoc1: '<UNKNOWN LOCATION>'
53 ; YAML-NEXT: - String: ')'
55 define void @dog() #0 !dbg !8 {
57 %x = alloca i32, align 4
58 %y = alloca i32, align 4
59 store i32 0, i32* %x, align 4
60 store i32 1, i32* %y, align 4, !dbg !12
64 define void @cat() #0 !dbg !14 {
66 %x = alloca i32, align 4
67 %y = alloca i32, align 4
68 store i32 0, i32* %x, align 4
69 store i32 1, i32* %y, align 4, !dbg !16
73 define void @foo() #0 !dbg !18 {
74 %1 = alloca i32, align 4
75 %2 = alloca i32, align 4
76 %3 = alloca i32, align 4
77 %4 = alloca i32, align 4
78 %5 = alloca i32, align 4
79 %6 = alloca i32, align 4
80 store i32 1, i32* %1, align 4, !dbg !24
81 store i32 2, i32* %2, align 4
82 store i32 3, i32* %3, align 4
83 store i32 4, i32* %4, align 4
84 store i32 5, i32* %5, align 4
85 store i32 6, i32* %6, align 4, !dbg !26
89 define void @bar() #0 !dbg !27 {
90 %1 = alloca i32, align 4
91 %2 = alloca i32, align 4
92 %3 = alloca i32, align 4
93 %4 = alloca i32, align 4
94 %5 = alloca i32, align 4
95 %6 = alloca i32, align 4
96 store i32 1, i32* %1, align 4, !dbg !33
97 store i32 2, i32* %2, align 4
98 store i32 3, i32* %3, align 4
99 store i32 4, i32* %4, align 4
100 store i32 5, i32* %5, align 4
101 store i32 6, i32* %6, align 4, !dbg !35
105 attributes #0 = { noredzone nounwind ssp uwtable "no-frame-pointer-elim"="false" "target-cpu"="cyclone" }
108 !llvm.module.flags = !{!3, !4, !5, !6}
111 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
112 !1 = !DIFile(filename: "machine-outliner-remarks.ll", directory: "/tmp")
114 !3 = !{i32 2, !"Dwarf Version", i32 4}
115 !4 = !{i32 2, !"Debug Info Version", i32 3}
116 !5 = !{i32 1, !"wchar_size", i32 4}
117 !6 = !{i32 7, !"PIC Level", i32 2}
119 !8 = distinct !DISubprogram(name: "dog", scope: !1, file: !1, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
120 !9 = !DISubroutineType(types: !10)
122 !12 = !DILocation(line: 5, column: 9, scope: !8)
123 !14 = distinct !DISubprogram(name: "cat", scope: !1, file: !1, line: 10, type: !9, isLocal: false, isDefinition: true, scopeLine: 11, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
124 !16 = !DILocation(line: 13, column: 9, scope: !14)
125 !18 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 26, type: !9, isLocal: false, isDefinition: true, scopeLine: 26, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
126 !24 = !DILocation(line: 27, column: 9, scope: !18)
127 !26 = !DILocation(line: 29, column: 9, scope: !18)
128 !27 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 35, type: !9, isLocal: false, isDefinition: true, scopeLine: 35, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
129 !33 = !DILocation(line: 36, column: 1, scope: !27)
130 !35 = !DILocation(line: 38, column: 1, scope: !27)