xref: /llvm-project/llvm/test/Transforms/SampleProfile/remap-2.ll (revision 0271ae65a66367d802fa6866599d11e35f68450f)
1c67ccf5fSWei Mi; RUN: opt %s -passes=sample-profile -sample-profile-file=%S/Inputs/remap-2.prof -sample-profile-remapping-file=%S/Inputs/remap.map -S | FileCheck %s
2c67ccf5fSWei Mi; Check profile remapping works for searching inline instance, searching
3c67ccf5fSWei Mi; indirect call promotion candidate and prevent recursive inline.
4c67ccf5fSWei Mi
5c67ccf5fSWei Mi@x.addr = common global i32 zeroinitializer, align 16
6c67ccf5fSWei Mi@y.addr = common global i32 zeroinitializer, align 16
7c67ccf5fSWei Mi
8c67ccf5fSWei Midefine i32 @_ZN3foo3barERKN1M1XINS_6detail3quxEEE() #0 !dbg !9 {
9c67ccf5fSWei Mientry:
10*0271ae65SFangrui Song  %t0 = load i32, ptr @x.addr, align 4
11*0271ae65SFangrui Song  %t1 = load i32, ptr @y.addr, align 4
12c67ccf5fSWei Mi  %add = add nsw i32 %t0, %t1
13c67ccf5fSWei Mi  ret i32 %add
14c67ccf5fSWei Mi}
15c67ccf5fSWei Mi
16c67ccf5fSWei Midefine i32 @_ZN1M1XE() #0 !dbg !10 {
17c67ccf5fSWei Mientry:
18*0271ae65SFangrui Song  %t0 = load i32, ptr @x.addr, align 4
19*0271ae65SFangrui Song  %t1 = load i32, ptr @y.addr, align 4
20c67ccf5fSWei Mi  %sub = sub nsw i32 %t0, %t1
21c67ccf5fSWei Mi  ret i32 %sub
22c67ccf5fSWei Mi}
23c67ccf5fSWei Mi
24*0271ae65SFangrui Songdefine void @test(ptr) #0 !dbg !4 {
25*0271ae65SFangrui Song  %t2 = alloca ptr
26*0271ae65SFangrui Song  store ptr %0, ptr %t2
27*0271ae65SFangrui Song  %t3 = load ptr, ptr %t2
28c67ccf5fSWei Mi; Check call i32 %t3 has been indirect call promoted and call i32 @_ZN1M1XE
29c67ccf5fSWei Mi; has been inlined.
30c67ccf5fSWei Mi; CHECK-LABEL: @test(
31*0271ae65SFangrui Song; CHECK: icmp eq ptr %t3, @_ZN3foo3barERKN1M1XINS_6detail3quxEEE
32c67ccf5fSWei Mi; CHECK-NOT: call i32 @_ZN1M1XE
33c67ccf5fSWei Mi  %t4 = call i32 %t3(), !dbg !7
34c67ccf5fSWei Mi  %t5 = call i32 @_ZN1M1XE(), !dbg !8
35c67ccf5fSWei Mi  ret void
36c67ccf5fSWei Mi}
37c67ccf5fSWei Mi
38*0271ae65SFangrui Songdefine void @_ZN1M1X1YE(ptr) #0 !dbg !11 {
39*0271ae65SFangrui Song  %t2 = alloca ptr
40*0271ae65SFangrui Song  store ptr %0, ptr %t2
41*0271ae65SFangrui Song  %t3 = load ptr, ptr %t2
42c67ccf5fSWei Mi; Check call i32 %t3 has got its profile but is not indirect call promoted
43c67ccf5fSWei Mi; because the promotion candidate is a recursive call to the current function.
44c67ccf5fSWei Mi; CHECK-LABEL: @_ZN1M1X1YE(
45c67ccf5fSWei Mi; CHECK: call i32 %t3(), {{.*}} !prof ![[PROFID:[0-9]+]]
46*0271ae65SFangrui Song; CHECK-NOT: icmp eq ptr %t3, @_ZN1M1X1YE
47c67ccf5fSWei Mi  %t4 = call i32 %t3(), !dbg !12
48c67ccf5fSWei Mi  ret void
49c67ccf5fSWei Mi}
50c67ccf5fSWei Mi
51c67ccf5fSWei Mi; CHECK: ![[PROFID]] = !{!"VP", i32 0, i64 3000
52c67ccf5fSWei Mi
53c67ccf5fSWei Miattributes #0 = { "use-sample-profile" }
54c67ccf5fSWei Mi
55c67ccf5fSWei Mi!llvm.dbg.cu = !{!0}
56c67ccf5fSWei Mi!llvm.module.flags = !{!13, !14}
57c67ccf5fSWei Mi!llvm.ident = !{!15}
58c67ccf5fSWei Mi
59c67ccf5fSWei Mi!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
60c67ccf5fSWei Mi!1 = !DIFile(filename: "calls.cc", directory: ".")
61c67ccf5fSWei Mi!2 = !{}
62c67ccf5fSWei Mi!4 = distinct !DISubprogram(name: "test", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
63c67ccf5fSWei Mi!5 = !DIFile(filename: "calls.cc", directory: ".")
64c67ccf5fSWei Mi!6 = !DISubroutineType(types: !2)
65c67ccf5fSWei Mi!7 = !DILocation(line: 8, scope: !4)
66c67ccf5fSWei Mi!8 = !DILocation(line: 9, scope: !4)
67c67ccf5fSWei Mi!9 = distinct !DISubprogram(name: "_ZN3foo3barERKN1M1XINS_6detail3quxEEE", line: 15, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
68c67ccf5fSWei Mi!10 = distinct !DISubprogram(name: "_ZN1M1XE", line: 20, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
69c67ccf5fSWei Mi!11 = distinct !DISubprogram(name: "_ZN1M1X1YE", line: 25, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !1, scope: !5, type: !6, retainedNodes: !2)
70c67ccf5fSWei Mi!12 = !DILocation(line: 30, scope: !11)
71c67ccf5fSWei Mi!13 = !{i32 2, !"Dwarf Version", i32 4}
72c67ccf5fSWei Mi!14 = !{i32 1, !"Debug Info Version", i32 3}
73c67ccf5fSWei Mi!15 = !{!"clang version 3.5 "}
74c67ccf5fSWei Mi
75