12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_profgen -o %t -O3 %s 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: llvm-profdata merge -o %t.profdata %t.profraw 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s | FileCheck %s 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_runtime = 0; 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __llvm_profile_initialize_file(void); 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_write_file(void); 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __llvm_profile_set_filename(const char *); 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint foo(int); 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, const char *argv[]) { 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK-LABEL: define i32 @main 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof !1 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (argc > 1) 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Since the runtime has been suppressed, initialize the file name, as the 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // writing will fail below as the file name has not been specified. 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __llvm_profile_initialize_file(); 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Write out the profile. 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __llvm_profile_write_file(); 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Change the profile. 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return foo(0); 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint foo(int X) { 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // There should be no profiling information for @foo, since it was called 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // after the profile was written (and the atexit was suppressed by defining 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // profile_runtime). 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK-LABEL: define i32 @foo 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{[^,]+$}} 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return X <= 0 ? -X : X; 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 2} 36