Index: test/CodeGen/Inputs/pgo-sample.prof =================================================================== --- test/CodeGen/Inputs/pgo-sample.prof +++ test/CodeGen/Inputs/pgo-sample.prof @@ -1,2 +1,7 @@ -bar:100:100 - 1: 2000 +bar:1000:1000 + 1: 1000 + 2: 0 +foo:1000:1000 + 1:bar:1000 + 1: 1000 + 2: 1000 Index: test/CodeGen/pgo-sample.c =================================================================== --- test/CodeGen/pgo-sample.c +++ test/CodeGen/pgo-sample.c @@ -1,6 +1,31 @@ // Test if PGO sample use passes are invoked. // -// Ensure Pass PGOInstrumentationGenPass is invoked. -// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample.prof %s -mllvm -debug-pass=Structure -emit-llvm -o - 2>&1 | FileCheck %s +// Ensure Pass SampleProfileLoader is invoked. +// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample.prof %s -mllvm -debug-pass=Structure -mllvm -inline-threshold=0 -emit-llvm -o - 2>&1 | FileCheck %s // CHECK: Remove unused exception handling info // CHECK: Sample profile pass + +void baz(); + +// CHECK-LABEL: @callee( +void callee(int t) { + for (int i = 0; i < t; i++) + baz(); +} + +// CHECK-LABEL: @bar( +// cold call to callee should not be inlined. +// CHECK: call void @callee +void bar(int x) { + if (x < 100) + callee(x); +} + +// CHECK-LABEL: @foo( +// bar should be early-inlined because it is hot inline instance in profile. +// callee should be inlined because it is hot callsite in the inline instance +// of foo:bar. +// CHECK-NOT: call void @callee +void foo(int x) { + bar(x); +}