This patch changes cc1 option for PGO profile use from
-fprofile-instr-use=<path> to -fprofile-instrument-use-path=<path>.
-fprofile-instr-use=<path> is now a driver only option.
In addition to decouple the cc1 option from the driver level option, this patch
also enables IR level profile use. cc1 option handling now reads the profile
header and sets CodeGenOpt ProfileUse (valid values are {None, Clang, LLVM}
-- this is a common enum for -fprofile-instrument={}, for the profile
instrumentation), and invoke the pipeline to enable the respective PGO use pass.
Reviewers: silvas, davidxl
Differential Revision: http://reviews.llvm.org/D17737
llvm-svn: 262515
76 lines
2.5 KiB
Objective-C
76 lines
2.5 KiB
Objective-C
// Test instrumentation of general constructs in objective C.
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name objc-general.m %s -o - -emit-llvm -fblocks -fprofile-instrument=clang | FileCheck -check-prefix=PGOGEN %s
|
|
|
|
// RUN: llvm-profdata merge %S/Inputs/objc-general.proftext -o %t.profdata
|
|
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name objc-general.m %s -o - -emit-llvm -fblocks -fprofile-instrument-use-path=%t.profdata | FileCheck -check-prefix=PGOUSE %s
|
|
|
|
#ifdef HAVE_FOUNDATION
|
|
|
|
// Use this to build an instrumented version to regenerate the input file.
|
|
#import <Foundation/Foundation.h>
|
|
|
|
#else
|
|
|
|
// Minimal definitions to get this to compile without Foundation.h.
|
|
|
|
@protocol NSObject
|
|
@end
|
|
|
|
@interface NSObject <NSObject>
|
|
- (id)init;
|
|
+ (id)alloc;
|
|
@end
|
|
|
|
struct NSFastEnumerationState;
|
|
@interface NSArray : NSObject
|
|
- (unsigned long) countByEnumeratingWithState: (struct NSFastEnumerationState*) state
|
|
objects: (id*) buffer
|
|
count: (unsigned long) bufferSize;
|
|
+(NSArray*) arrayWithObjects: (id) first, ...;
|
|
@end;
|
|
#endif
|
|
|
|
// PGOGEN: @[[FRC:"__profc_objc_general.m_\+\[A foreach_\]"]] = private global [2 x i64] zeroinitializer
|
|
// PGOGEN: @[[BLC:"__profc_objc_general.m___13\+\[A foreach_\]_block_invoke"]] = private global [2 x i64] zeroinitializer
|
|
// PGOGEN: @[[MAC:__profc_main]] = private global [1 x i64] zeroinitializer
|
|
|
|
@interface A : NSObject
|
|
+ (void)foreach: (NSArray *)array;
|
|
@end
|
|
|
|
@implementation A
|
|
// PGOGEN: define {{.*}}+[A foreach:]
|
|
// PGOUSE: define {{.*}}+[A foreach:]
|
|
// PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 0
|
|
+ (void)foreach: (NSArray *)array
|
|
{
|
|
__block id result;
|
|
// PGOGEN: store {{.*}} @[[FRC]], i64 0, i64 1
|
|
// PGOUSE: br {{.*}} !prof ![[FR1:[0-9]+]]
|
|
// PGOUSE: br {{.*}} !prof ![[FR2:[0-9]+]]
|
|
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: ![[FR1]] = !{!"branch_weights", i32 2, i32 3}
|
|
// PGOUSE-DAG: ![[FR2]] = !{!"branch_weights", i32 3, i32 2}
|
|
// PGOUSE-DAG: ![[BL1]] = !{!"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];
|
|
[A foreach: array];
|
|
return 0;
|
|
}
|