summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorDehao Chen <dehao@google.com>2017-09-19 18:26:54 +0000
committerDehao Chen <dehao@google.com>2017-09-19 18:26:54 +0000
commitb6e60c8b80704e948cf049569145ddf8497d7e05 (patch)
tree3d75dfb13efa0af1be8c57b31d5da83c50c98a79 /llvm/test
parent26fa1bf4da3cbae98251ebd2db2dcee37b89120c (diff)
downloadbcm5719-llvm-b6e60c8b80704e948cf049569145ddf8497d7e05.tar.gz
bcm5719-llvm-b6e60c8b80704e948cf049569145ddf8497d7e05.zip
Handle profile mismatch correctly for SamplePGO.
Summary: Fix the bug when promoted call return type mismatches with the promoted function, we should not try to inline it. Otherwise it may lead to compiler crash. Reviewers: davidxl, tejohnson, eraman Reviewed By: tejohnson Subscribers: llvm-commits, sanjoy Differential Revision: https://reviews.llvm.org/D38018 llvm-svn: 313658
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/SampleProfile/Inputs/indirect-call.prof3
-rw-r--r--llvm/test/Transforms/SampleProfile/indirect-call.ll20
2 files changed, 23 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SampleProfile/Inputs/indirect-call.prof b/llvm/test/Transforms/SampleProfile/Inputs/indirect-call.prof
index ff1368142a0..f35b4b13c71 100644
--- a/llvm/test/Transforms/SampleProfile/Inputs/indirect-call.prof
+++ b/llvm/test/Transforms/SampleProfile/Inputs/indirect-call.prof
@@ -20,3 +20,6 @@ test_inline_strip_conflict:3000:0
test_norecursive_inline:3000:0
1: test_norecursive_inline:3000
20: 3000
+test_noinline_bitcast:3000:0
+ 1: foo_direct_i32:3000
+ 1: 3000
diff --git a/llvm/test/Transforms/SampleProfile/indirect-call.ll b/llvm/test/Transforms/SampleProfile/indirect-call.ll
index bee98f1066d..28d61ed2426 100644
--- a/llvm/test/Transforms/SampleProfile/indirect-call.ll
+++ b/llvm/test/Transforms/SampleProfile/indirect-call.ll
@@ -69,6 +69,19 @@ define void @test_noinline(void ()*) !dbg !12 {
ret void
}
+; CHECK-LABEL: @test_noinline_bitcast
+; If the indirect call has been promoted to a direct call with bitcast,
+; do not inline it.
+define float @test_noinline_bitcast(float ()*) !dbg !26 {
+ %2 = alloca float ()*
+ store float ()* %0, float ()** %2
+; CHECK: icmp
+; CHECK: call
+ %3 = load float ()*, float ()** %2
+ %4 = call float %3(), !dbg !27
+ ret float %4
+}
+
; CHECK-LABEL: @test_norecursive_inline
; If the indirect call target is the caller, we should not promote it.
define void @test_norecursive_inline() !dbg !24 {
@@ -114,6 +127,10 @@ define void @foo_direct() !dbg !21 {
ret void
}
+define i32 @foo_direct_i32() !dbg !28 {
+ ret i32 0;
+}
+
; CHECK-LABEL: @test_direct
; We should not promote a direct call.
define void @test_direct() !dbg !22 {
@@ -155,3 +172,6 @@ define void @test_direct() !dbg !22 {
!23 = !DILocation(line: 23, scope: !22)
!24 = distinct !DISubprogram(name: "test_norecursive_inline", scope: !1, file: !1, line: 12, unit: !0)
!25 = !DILocation(line: 13, scope: !24)
+!26 = distinct !DISubprogram(name: "test_noinline_bitcast", scope: !1, file: !1, line: 12, unit: !0)
+!27 = !DILocation(line: 13, scope: !26)
+!28 = distinct !DISubprogram(name: "foo_direct_i32", scope: !1, file: !1, line: 11, unit: !0)
OpenPOWER on IntegriCloud