mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
3e49aa8f87
Add support to widen select instructions in VPlan native path by using a correct recipe when such instructions are encountered. This is already used by inner loop vectorizer. Previously select instructions get handled by the wrong recipe and resulted in unreachable instruction errors like this one: https://bugs.llvm.org/show_bug.cgi?id=48139. Reviewed By: fhahn Differential Revision: https://reviews.llvm.org/D97136
88 lines
2.9 KiB
C++
88 lines
2.9 KiB
C++
//===- 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/Analysis/TargetLibraryInfo.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:
|
|
TargetLibraryInfoImpl TLII;
|
|
TargetLibraryInfo TLI;
|
|
DataLayout DL;
|
|
|
|
std::unique_ptr<LLVMContext> Ctx;
|
|
std::unique_ptr<Module> M;
|
|
std::unique_ptr<LoopInfo> LI;
|
|
std::unique_ptr<DominatorTree> DT;
|
|
std::unique_ptr<AssumptionCache> AC;
|
|
std::unique_ptr<ScalarEvolution> SE;
|
|
|
|
VPlanTestBase()
|
|
: TLII(), TLI(TLII),
|
|
DL("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-"
|
|
"f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:"
|
|
"16:32:64-S128"),
|
|
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));
|
|
AC.reset(new AssumptionCache(F));
|
|
SE.reset(new ScalarEvolution(F, TLI, *AC, *DT, *LI));
|
|
}
|
|
|
|
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
|