forked from OSchip/llvm-project
PGO: Add support for Objective-C blocks.
llvm-svn: 203157
This commit is contained in:
parent
6292a140ee
commit
c845c00a5b
|
@ -1200,8 +1200,14 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD,
|
|||
|
||||
if (IsLambdaConversionToBlock)
|
||||
EmitLambdaBlockInvokeBody();
|
||||
else
|
||||
else {
|
||||
PGO.assignRegionCounters(blockDecl, fn);
|
||||
RegionCounter Cnt = getPGORegionCounter(blockDecl->getBody());
|
||||
Cnt.beginRegion(Builder);
|
||||
EmitStmt(blockDecl->getBody());
|
||||
PGO.emitWriteoutFunction();
|
||||
PGO.destroyRegionCounters();
|
||||
}
|
||||
|
||||
// Remember where we were...
|
||||
llvm::BasicBlock *resume = Builder.GetInsertBlock();
|
||||
|
|
|
@ -315,6 +315,10 @@ namespace {
|
|||
(*CounterMap)[S->getBody()] = NextCounter++;
|
||||
Visit(S->getBody());
|
||||
}
|
||||
void VisitBlockDecl(const BlockDecl *S) {
|
||||
(*CounterMap)[S->getBody()] = NextCounter++;
|
||||
Visit(S->getBody());
|
||||
}
|
||||
/// Assign a counter to track the block following a label.
|
||||
void VisitLabelStmt(const LabelStmt *S) {
|
||||
(*CounterMap)[S] = NextCounter++;
|
||||
|
@ -481,6 +485,13 @@ namespace {
|
|||
Visit(S->getBody());
|
||||
}
|
||||
|
||||
void VisitBlockDecl(const BlockDecl *S) {
|
||||
RegionCounter Cnt(PGO, S->getBody());
|
||||
Cnt.beginRegion();
|
||||
(*CountMap)[S->getBody()] = PGO.getCurrentRegionCount();
|
||||
Visit(S->getBody());
|
||||
}
|
||||
|
||||
void VisitReturnStmt(const ReturnStmt *S) {
|
||||
RecordStmtCount(S);
|
||||
if (S->getRetValue())
|
||||
|
@ -802,6 +813,8 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) {
|
|||
Walker.VisitFunctionDecl(FD);
|
||||
else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
|
||||
Walker.VisitObjCMethodDecl(MD);
|
||||
else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
|
||||
Walker.VisitBlockDecl(BD);
|
||||
NumRegionCounters = Walker.NextCounter;
|
||||
}
|
||||
|
||||
|
@ -812,6 +825,8 @@ void CodeGenPGO::computeRegionCounts(const Decl *D) {
|
|||
Walker.VisitFunctionDecl(FD);
|
||||
else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
|
||||
Walker.VisitObjCMethodDecl(MD);
|
||||
else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
|
||||
Walker.VisitBlockDecl(BD);
|
||||
}
|
||||
|
||||
void CodeGenPGO::emitCounterVariables() {
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
instr-profile.m:__13+[A foreach:]_block_invoke 2
|
||||
2
|
||||
1
|
||||
|
||||
instr-profile.m:+[A foreach:] 2
|
||||
1
|
||||
2
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
// of running the program generated by the -fprofile-instr-generate case. As
|
||||
// such, main() should call every function in this test.
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name instr-profile.m %s -o - -emit-llvm -fprofile-instr-generate | FileCheck -check-prefix=PGOGEN %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name instr-profile.m %s -o - -emit-llvm -fprofile-instr-use=%S/Inputs/instr-profile.profdata | FileCheck -check-prefix=PGOUSE %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name instr-profile.m %s -o - -emit-llvm -fblocks -fprofile-instr-generate | FileCheck -check-prefix=PGOGEN %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name instr-profile.m %s -o - -emit-llvm -fblocks -fprofile-instr-use=%S/Inputs/instr-profile.profdata | FileCheck -check-prefix=PGOUSE %s
|
||||
|
||||
#ifdef HAVE_FOUNDATION
|
||||
|
||||
|
@ -33,7 +33,9 @@ struct NSFastEnumerationState;
|
|||
@end;
|
||||
#endif
|
||||
|
||||
// PGOGEN: @[[FOR:__llvm_pgo_ctr[0-9]*]] = private global [2 x i64] zeroinitializer
|
||||
// PGOGEN: @[[FRC:__llvm_pgo_ctr[0-9]*]] = private global [2 x i64] zeroinitializer
|
||||
// PGOGEN: @[[BLC:__llvm_pgo_ctr[0-9]*]] = private global [2 x i64] zeroinitializer
|
||||
// PGOGEN: @[[MAC:__llvm_pgo_ctr[0-9]*]] = private global [1 x i64] zeroinitializer
|
||||
|
||||
@interface A : NSObject
|
||||
+ (void)foreach: (NSArray *)array;
|
||||
|
@ -42,16 +44,28 @@ struct NSFastEnumerationState;
|
|||
@implementation A
|
||||
// PGOGEN: define {{.*}}+[A foreach:]
|
||||
// PGOUSE: define {{.*}}+[A foreach:]
|
||||
// PGOGEN: store {{.*}} @[[FOR]], i64 0, i64 0
|
||||
// PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 0
|
||||
+ (void)foreach: (NSArray *)array
|
||||
{
|
||||
// PGOGEN: store {{.*}} @[[FOR]], i64 0, i64 1
|
||||
__block id result;
|
||||
// PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 1
|
||||
// FIXME: We don't emit branch weights for this yet.
|
||||
for (id x in array) {
|
||||
// PGOGEN: define {{.*}}_block_invoke
|
||||
// PGOUSE: define {{.*}}_block_invoke
|
||||
// PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 0
|
||||
^{ static int init = 0;
|
||||
// PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 1
|
||||
// PGOUSE: br {{.*}} !prof ![[BL1:[0-9]+]]
|
||||
if (init)
|
||||
result = x;
|
||||
init = 1; }();
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
// PGOUSE-DAG: ![[BL1]] = metadata !{metadata !"branch_weights", i32 2, i32 2}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
A *a = [[A alloc] init];
|
||||
NSArray *array = [NSArray arrayWithObjects: @"0", @"1", (void*)0];
|
||||
|
|
Loading…
Reference in New Issue