//===- llvm/unittest/Transforms/Vectorize/VPlanTestBase.h -----------------===// // // 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 // //===----------------------------------------------------------------------===// /// \file /// This file defines a VPlanTestBase class, which provides helpers to parse /// a LLVM IR string and create VPlans given a loop entry block. //===----------------------------------------------------------------------===// #ifndef LLVM_UNITTESTS_TRANSFORMS_VECTORIZE_VPLANTESTBASE_H #define LLVM_UNITTESTS_TRANSFORMS_VECTORIZE_VPLANTESTBASE_H #include "../lib/Transforms/Vectorize/VPlan.h" #include "../lib/Transforms/Vectorize/VPlanHCFGBuilder.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/BasicAliasAnalysis.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/AsmParser/Parser.h" #include "llvm/IR/Dominators.h" #include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" namespace llvm { /// Helper class to create a module from an assembly string and VPlans for a /// given loop entry block. class VPlanTestBase : public testing::Test { protected: std::unique_ptr Ctx; std::unique_ptr M; std::unique_ptr LI; std::unique_ptr DT; VPlanTestBase() : Ctx(new LLVMContext) {} Module &parseModule(const char *ModuleString) { SMDiagnostic Err; M = parseAssemblyString(ModuleString, Err, *Ctx); EXPECT_TRUE(M); return *M; } void doAnalysis(Function &F) { DT.reset(new DominatorTree(F)); LI.reset(new LoopInfo(*DT)); } VPlanPtr buildHCFG(BasicBlock *LoopHeader) { doAnalysis(*LoopHeader->getParent()); auto Plan = std::make_unique(); VPlanHCFGBuilder HCFGBuilder(LI->getLoopFor(LoopHeader), LI.get(), *Plan); HCFGBuilder.buildHierarchicalCFG(); return Plan; } /// Build the VPlan plain CFG for the loop starting from \p LoopHeader. VPlanPtr buildPlainCFG(BasicBlock *LoopHeader) { doAnalysis(*LoopHeader->getParent()); auto Plan = std::make_unique(); VPlanHCFGBuilder HCFGBuilder(LI->getLoopFor(LoopHeader), LI.get(), *Plan); VPRegionBlock *TopRegion = HCFGBuilder.buildPlainCFG(); Plan->setEntry(TopRegion); return Plan; } }; } // namespace llvm #endif // LLVM_UNITTESTS_TRANSFORMS_VECTORIZE_VPLANTESTBASE_H