1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- //===- 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/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<LLVMContext> Ctx;
- std::unique_ptr<Module> M;
- std::unique_ptr<LoopInfo> LI;
- std::unique_ptr<DominatorTree> 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<VPlan>();
- 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<VPlan>();
- 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
|