//===----- ProfDataUtils.cpp - Unit tests for ProfDataUtils ---------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/AsmParser/Parser.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/ProfDataUtils.h" #include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" using namespace llvm; static std::unique_ptr parseIR(LLVMContext &C, const char *IR) { SMDiagnostic Err; std::unique_ptr Mod = parseAssemblyString(IR, Err, C); if (!Mod) Err.print("ProfDataUtilsTests", errs()); return Mod; } TEST(ProfDataUtils, extractWeights) { LLVMContext C; std::unique_ptr M = parseIR(C, R"IR( define void @foo(i1 %cond0) { entry: br i1 %cond0, label %bb0, label %bb1, !prof !1 bb0: %0 = mul i32 1, 2 br label %bb1 bb1: ret void } !1 = !{!"branch_weights", i32 1, i32 100000} )IR"); Function *F = M->getFunction("foo"); auto &Entry = F->getEntryBlock(); auto &I = Entry.front(); auto *Branch = dyn_cast(&I); EXPECT_NE(nullptr, Branch); auto *ProfileData = Branch->getMetadata(LLVMContext::MD_prof); EXPECT_NE(ProfileData, nullptr); EXPECT_TRUE(hasProfMD(I)); SmallVector Weights; EXPECT_TRUE(extractBranchWeights(ProfileData, Weights)); EXPECT_EQ(Weights[0], 1U); EXPECT_EQ(Weights[1], 100000U); EXPECT_EQ(Weights.size(), 2U); } TEST(ProfDataUtils, NoWeights) { LLVMContext C; std::unique_ptr M = parseIR(C, R"IR( define void @foo(i1 %cond0) { entry: br i1 %cond0, label %bb0, label %bb1 bb0: %0 = mul i32 1, 2 br label %bb1 bb1: ret void } )IR"); Function *F = M->getFunction("foo"); auto &Entry = F->getEntryBlock(); auto &I = Entry.front(); auto *Branch = dyn_cast(&I); EXPECT_NE(nullptr, Branch); auto *ProfileData = Branch->getMetadata(LLVMContext::MD_prof); EXPECT_EQ(ProfileData, nullptr); EXPECT_FALSE(hasProfMD(I)); SmallVector Weights; EXPECT_FALSE(extractBranchWeights(ProfileData, Weights)); EXPECT_EQ(Weights.size(), 0U); }