blob: e6e294fd6bfdf7c6f7767b35d5dd0881ae34bd2d [file] [log] [blame]
Dehao Chen77079002017-01-20 22:56:07 +00001; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/indirect-call.prof -S | FileCheck %s
2
Dehao Chen274df5e2017-01-31 17:49:37 +00003; CHECK-LABEL: @test
Dehao Chen77079002017-01-20 22:56:07 +00004define void @test(void ()*) !dbg !3 {
5 %2 = alloca void ()*
6 store void ()* %0, void ()** %2
7 %3 = load void ()*, void ()** %2
8 ; CHECK: call {{.*}}, !prof ![[PROF:[0-9]+]]
9 call void %3(), !dbg !4
10 ret void
11}
12
Dehao Chen274df5e2017-01-31 17:49:37 +000013; CHECK-LABEL: @test_inline
14; If the indirect call is promoted and inlined in profile, we should promote and inline it.
Dehao Chenc81483d2017-02-06 18:10:36 +000015define void @test_inline(i64* (i32*)*, i32* %x) !dbg !3 {
16 %2 = alloca i64* (i32*)*
17 store i64* (i32*)* %0, i64* (i32*)** %2
18 %3 = load i64* (i32*)*, i64* (i32*)** %2
Dehao Chen274df5e2017-01-31 17:49:37 +000019; CHECK: icmp {{.*}} @foo_inline
20; CHECK: if.true.direct_targ:
21; CHECK-NOT: call
22; CHECK: if.false.orig_indirect:
23; CHECK: call
Dehao Chenc81483d2017-02-06 18:10:36 +000024 call i64* %3(i32* %x), !dbg !5
Dehao Chen274df5e2017-01-31 17:49:37 +000025 ret void
26}
27
28; CHECK-LABEL: @test_noinline
29; If the indirect call target is not available, we should not promote it.
30define void @test_noinline(void ()*) !dbg !3 {
31 %2 = alloca void ()*
32 store void ()* %0, void ()** %2
33 %3 = load void ()*, void ()** %2
34; CHECK-NOT: icmp
35; CHECK: call
36 call void %3(), !dbg !5
37 ret void
38}
39
Dehao Chenc81483d2017-02-06 18:10:36 +000040@x = global i32 0, align 4
41
42define i32* @foo_inline(i32* %x) !dbg !3 {
43 ret i32* %x
Dehao Chen274df5e2017-01-31 17:49:37 +000044}
45
46define i32 @foo_noinline(i32 %x) !dbg !3 {
47 ret i32 %x
48}
49
Dehao Chen4a9dd702017-02-06 23:33:15 +000050define void @foo_direct() !dbg !3 {
51 ret void
52}
53
54; CHECK-LABEL: @test_direct
55; We should not promote a direct call.
56define void @test_direct() !dbg !3 {
57; CHECK-NOT: icmp
58; CHECK: call
59 call void @foo_alias(), !dbg !5
60 ret void
61}
62
63@foo_alias = alias void (), void ()* @foo_direct
64
Dehao Chen77079002017-01-20 22:56:07 +000065!llvm.dbg.cu = !{!0}
66!llvm.module.flags = !{!2}
67
68!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1)
69!1 = !DIFile(filename: "test.cc", directory: "/")
70!2 = !{i32 2, !"Debug Info Version", i32 3}
71!3 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 1, unit: !0)
72!4 = !DILocation(line: 5, scope: !3)
Dehao Chen274df5e2017-01-31 17:49:37 +000073!5 = !DILocation(line: 6, scope: !3)
Dehao Chen77079002017-01-20 22:56:07 +000074; CHECK: ![[PROF]] = !{!"VP", i32 0, i64 3457, i64 9191153033785521275, i64 2059, i64 -1069303473483922844, i64 1398}