| // Test end-to-end optimization pipeline with MemPGO, that it does not interfere | |
| // with other allocation instrumentation features. | |
| // | |
| // RUN: split-file %s %t | |
| // RUN: llvm-profdata merge %t/memprof.yaml -o %t/use.profdata | |
| // RUN: %clang_cc1 -O2 -debug-info-kind=limited -fmemory-profile-use=%t/use.profdata -mllvm -optimize-hot-cold-new \ | |
| // RUN: %t/src.cpp -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,DEFAULT | |
| // RUN: %clang_cc1 -O2 -fsanitize=alloc-token -debug-info-kind=limited -fmemory-profile-use=%t/use.profdata -mllvm -optimize-hot-cold-new \ | |
| // RUN: %t/src.cpp -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,ALLOCTOKEN | |
| //--- memprof.yaml | |
| --- | |
| HeapProfileRecords: | |
| - GUID: 0x7f8d88fcc70a347b | |
| AllocSites: | |
| - Callstack: | |
| - { Function: 0x7f8d88fcc70a347b, LineOffset: 1, Column: 10, IsInlineFrame: false } | |
| - { Function: 0xdb956436e78dd5fa, LineOffset: 1, Column: 13, IsInlineFrame: false } | |
| MemInfoBlock: | |
| AllocCount: 1 | |
| TotalAccessCount: 0 | |
| MinAccessCount: 0 | |
| MaxAccessCount: 0 | |
| TotalSize: 10 | |
| MinSize: 10 | |
| MaxSize: 10 | |
| AllocTimestamp: 100 | |
| DeallocTimestamp: 100 | |
| TotalLifetime: 100000 | |
| MinLifetime: 100000 | |
| MaxLifetime: 100000 | |
| AllocCpuId: 0 | |
| DeallocCpuId: 0 | |
| NumMigratedCpu: 0 | |
| NumLifetimeOverlaps: 0 | |
| NumSameAllocCpu: 0 | |
| NumSameDeallocCpu: 0 | |
| DataTypeId: 0 | |
| TotalAccessDensity: 0 | |
| MinAccessDensity: 0 | |
| MaxAccessDensity: 0 | |
| TotalLifetimeAccessDensity: 0 | |
| MinLifetimeAccessDensity: 0 | |
| MaxLifetimeAccessDensity: 0 | |
| AccessHistogramSize: 0 | |
| AccessHistogram: 0 | |
| ... | |
| //--- src.cpp | |
| // CHECK-LABEL: define{{.*}} ptr @_Z3foov() | |
| // DEFAULT: call {{.*}} ptr @_Znam12__hot_cold_t(i64 10, i8 -128) | |
| // ALLOCTOKEN: call {{.*}} ptr @__alloc_token__Znam12__hot_cold_t(i64 10, i8 -128, i64 1538840549748785101){{.*}} !alloc_token | |
| char *foo() { | |
| return new char[10]; | |
| } | |
| int main() { | |
| char *a = foo(); | |
| delete[] a; | |
| return 0; | |
| } |