mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
7416a3a392
When calculating the cost of a call instruction we were applying a heuristic penalty as well as the cost of the instruction itself. However, when calculating the benefit from inlining we weren't discounting the equivalent penalty for the call instruction that would be removed! This caused skew in the calculation and meant we wouldn't inline in the following, trivial case: int g() { h(); } int f() { g(); } llvm-svn: 286814
88 lines
3.8 KiB
LLVM
88 lines
3.8 KiB
LLVM
; RUN: opt < %s -S -inline -pass-remarks-output=%t -pass-remarks=inline \
|
|
; RUN: -pass-remarks-missed=inline -pass-remarks-analysis=inline \
|
|
; RUN: -pass-remarks-with-hotness 2>&1 | FileCheck %s
|
|
; RUN: cat %t | FileCheck -check-prefix=YAML %s
|
|
|
|
; Check the YAML file for inliner-generated passed and analysis remarks. This
|
|
; is the input:
|
|
|
|
; 1 int foo() { return 1; }
|
|
; 2
|
|
; 3 int bar() {
|
|
; 4 return foo();
|
|
; 5 }
|
|
|
|
; CHECK: remark: /tmp/s.c:4:10: foo can be inlined into bar with cost={{[0-9\-]+}} (threshold={{[0-9]+}}) (hotness: 30)
|
|
; CHECK-NEXT: remark: /tmp/s.c:4:10: foo inlined into bar (hotness: 30)
|
|
|
|
; YAML: --- !Analysis
|
|
; YAML-NEXT: Pass: inline
|
|
; YAML-NEXT: Name: CanBeInlined
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 4, Column: 10 }
|
|
; YAML-NEXT: Function: bar
|
|
; YAML-NEXT: Hotness: 30
|
|
; YAML-NEXT: Args:
|
|
; YAML-NEXT: - Callee: foo
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 1, Column: 0 }
|
|
; YAML-NEXT: - String: ' can be inlined into '
|
|
; YAML-NEXT: - Caller: bar
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 3, Column: 0 }
|
|
; YAML-NEXT: - String: ' with cost='
|
|
; YAML-NEXT: - Cost: '{{[0-9\-]+}}'
|
|
; YAML-NEXT: - String: ' (threshold='
|
|
; YAML-NEXT: - Threshold: '{{[0-9]+}}'
|
|
; YAML-NEXT: - String: ')'
|
|
; YAML-NEXT: ...
|
|
; YAML-NEXT: --- !Passed
|
|
; YAML-NEXT: Pass: inline
|
|
; YAML-NEXT: Name: Inlined
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 4, Column: 10 }
|
|
; YAML-NEXT: Function: bar
|
|
; YAML-NEXT: Hotness: 30
|
|
; YAML-NEXT: Args:
|
|
; YAML-NEXT: - Callee: foo
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 1, Column: 0 }
|
|
; YAML-NEXT: - String: ' inlined into '
|
|
; YAML-NEXT: - Caller: bar
|
|
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 3, Column: 0 }
|
|
; YAML-NEXT: ...
|
|
|
|
; ModuleID = '/tmp/s.c'
|
|
source_filename = "/tmp/s.c"
|
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-apple-macosx10.11.0"
|
|
|
|
; Function Attrs: nounwind ssp uwtable
|
|
define i32 @foo() #0 !dbg !7 {
|
|
entry:
|
|
ret i32 1, !dbg !9
|
|
}
|
|
|
|
; Function Attrs: nounwind ssp uwtable
|
|
define i32 @bar() #0 !dbg !10 !prof !13 {
|
|
entry:
|
|
%call = call i32 @foo(), !dbg !11
|
|
ret i32 %call, !dbg !12
|
|
}
|
|
|
|
attributes #0 = { nounwind ssp uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4, !5}
|
|
!llvm.ident = !{!6}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 282540) (llvm/trunk 282542)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
|
|
!1 = !DIFile(filename: "/tmp/s.c", directory: "/tmp")
|
|
!2 = !{}
|
|
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = !{i32 1, !"PIC Level", i32 2}
|
|
!6 = !{!"clang version 4.0.0 (trunk 282540) (llvm/trunk 282542)"}
|
|
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, variables: !2)
|
|
!8 = !DISubroutineType(types: !2)
|
|
!9 = !DILocation(line: 1, column: 13, scope: !7)
|
|
!10 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, variables: !2)
|
|
!11 = !DILocation(line: 4, column: 10, scope: !10)
|
|
!12 = !DILocation(line: 4, column: 3, scope: !10)
|
|
!13 = !{!"function_entry_count", i64 30}
|