// This test makes sure that PGO profiling data leads to cold functions being
// marked as `cold` and hot functions with `inlinehint`.
// The test program contains an `if` where actual execution only ever takes the
// `else` branch. Accordingly, we expect the function that is never called to
// be marked as cold.
// See https://github.com/rust-lang/rust/pull/60262

//@ needs-profiler-runtime
//@ ignore-cross-compile

use run_make_support::{
    cwd, has_extension, has_prefix, llvm_filecheck, llvm_profdata, rfs, run_with_args, rustc,
    shallow_find_files,
};

fn main() {
    // Compile the test program with instrumentation
    // Disable the pre-inlining pass (i.e. a pass that does some inlining before
    // it adds the profiling instrumentation). Disabling this pass leads to
    // rather predictable IR which we need for this test to be stable.
    rustc()
        .opt_level("2")
        .codegen_units(1)
        .arg("-Cllvm-args=-disable-preinline")
        .profile_generate(cwd())
        .input("main.rs")
        .run();
    // Run it in order to generate some profiling data
    run_with_args("main", &["some-argument"]);
    // Postprocess the profiling data so it can be used by the compiler
    let profraw_files = shallow_find_files(cwd(), |path| {
        has_prefix(path, "default") && has_extension(path, "profraw")
    });
    let profraw_file = profraw_files.get(0).unwrap();
    llvm_profdata().merge().output("merged.profdata").input(profraw_file).run();
    // Compile the test program again, making use of the profiling data
    rustc()
        .opt_level("2")
        .codegen_units(1)
        .arg("-Cllvm-args=-disable-preinline")
        .profile_use("merged.profdata")
        .emit("llvm-ir")
        .input("main.rs")
        .run();
    // Check that the generate IR contains some things that we expect.
    // We feed the file into LLVM FileCheck tool *with its lines reversed* so that we see the
    // line with the function name before the line with the function attributes.
    // FileCheck only supports checking that something matches on the next line,
    // but not if something matches on the previous line.
    let ir = rfs::read_to_string("main.ll");
    let lines: Vec<_> = ir.lines().rev().collect();
    let mut reversed_ir = lines.join("\n");
    reversed_ir.push('\n');
    llvm_filecheck().patterns("filecheck-patterns.txt").stdin_buf(reversed_ir.as_bytes()).run();
}
