From fae8726799aae7c7b1f6209275b7033167abbd3d Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Thu, 6 Mar 2014 20:24:27 +0000 Subject: [PATCH] PGO: Add support for Objective-C blocks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203157 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGBlocks.cpp | 8 ++++++- lib/CodeGen/CodeGenPGO.cpp | 15 ++++++++++++ .../CodeGenObjC/Inputs/instr-profile.profdata | 4 ++++ test/CodeGenObjC/instr-profile.m | 24 +++++++++++++++---- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index b1717b3890..a75f341b3b 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -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(); diff --git a/lib/CodeGen/CodeGenPGO.cpp b/lib/CodeGen/CodeGenPGO.cpp index 349160ad35..cdd411cfa3 100644 --- a/lib/CodeGen/CodeGenPGO.cpp +++ b/lib/CodeGen/CodeGenPGO.cpp @@ -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(D)) Walker.VisitObjCMethodDecl(MD); + else if (const BlockDecl *BD = dyn_cast_or_null(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(D)) Walker.VisitObjCMethodDecl(MD); + else if (const BlockDecl *BD = dyn_cast_or_null(D)) + Walker.VisitBlockDecl(BD); } void CodeGenPGO::emitCounterVariables() { diff --git a/test/CodeGenObjC/Inputs/instr-profile.profdata b/test/CodeGenObjC/Inputs/instr-profile.profdata index f068640dbc..0fe046e579 100644 --- a/test/CodeGenObjC/Inputs/instr-profile.profdata +++ b/test/CodeGenObjC/Inputs/instr-profile.profdata @@ -1,3 +1,7 @@ +instr-profile.m:__13+[A foreach:]_block_invoke 2 +2 +1 + instr-profile.m:+[A foreach:] 2 1 2 diff --git a/test/CodeGenObjC/instr-profile.m b/test/CodeGenObjC/instr-profile.m index a7a0880eb6..c1bb50574d 100644 --- a/test/CodeGenObjC/instr-profile.m +++ b/test/CodeGenObjC/instr-profile.m @@ -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]; -- 2.40.0