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