Go to the documentation of this file.
33 #include "llvm/ADT/DenseMap.h"
34 #include "llvm/ADT/DenseSet.h"
35 #include "llvm/ADT/iterator_range.h"
36 #include "llvm/Analysis/LoopAnalysisManager.h"
37 #include "llvm/Analysis/LoopInfo.h"
38 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
39 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
40 #include "llvm/IR/DiagnosticInfo.h"
41 #include "llvm/IR/Function.h"
42 #include "llvm/IR/PassManager.h"
43 #include "llvm/Passes/PassBuilder.h"
44 #include "llvm/Passes/PassPlugin.h"
45 #include "llvm/Support/Debug.h"
46 #include "llvm/Support/raw_ostream.h"
113 explicit operator bool() {
114 return this->bool_operator_impl();
124 virtual void print(raw_ostream &OS)
const = 0;
128 void dump() { this->print(dbgs()); }
138 virtual StringRef getName()
const = 0;
160 bool isViolate =
false;
181 void print(raw_ostream &OS)
const override;
184 return R->
getKind() == VerificationKind::KernelSummary;
192 each_result[
static_cast<int>(R->
getKind())] = R;
196 if (back_branch_list.find(L) != back_branch_list.end()) {
197 return back_branch_list[L];
204 if (
auto back = getBackBranch(L)) {
205 return dyn_cast<CmpInst>(back->getCondition());
212 back_branch_list[L] = B;
216 return each_result.begin();
220 return each_result.end();
224 return make_range(result_begin(), result_end());
228 return "Loop verify result summary";
232 auto result = each_result.find(
static_cast<int>(kind));
233 if (result != each_result.end()) {
234 return result->second;
250 bool bool_operator_impl()
override;
272 void print(raw_ostream &OS)
const override;
279 valid_kernels.push_back(L);
280 loop_verify_results[L] = LVR;
284 return valid_kernels.begin();
288 return valid_kernels.end();
290 inline iterator_range<kernel_iterator>
kernels() {
291 return make_range(kernel_begin(), kernel_end());
294 return R->
getKind() == VerificationKind::FunctionSummary;
298 if (loop_verify_results.find(L) != loop_verify_results.end()) {
299 return &loop_verify_results[L];
306 return "Verify result summary";
310 return valid_kernels.size();
323 template<VerificationKind Kind>
354 template <
typename DerivedT>
370 LoopList findPerfectlyNestedLoop(Function &F,
371 LoopStandardAnalysisResults &AR);
374 FunctionAnalysisManager &AM);
385 Result run(Function &F, FunctionAnalysisManager &AM);
387 friend AnalysisInfoMixin<TimeMultiplexedVerifyPass>;
401 Result run(Function &F, FunctionAnalysisManager &AM);
403 friend AnalysisInfoMixin<DecoupledVerifyPass>;
414 void filter(SmallVector<Instruction*> *list);
415 void filter(SmallPtrSetImpl<Instruction*> *list);
417 void print(raw_ostream &OS)
const override;
420 unsupported.insert(I);
424 return "Instruction availability";
435 return unsupported.size() == 0;
448 template <
typename VerifyPassTy>
450 public AnalysisInfoMixin<VerifyInstAvailabilityPass<VerifyPassTy>> {
455 LoopStandardAnalysisResults &AR) {
457 #define DEBUG_TYPE "cgraomp"
459 <<
"Verifying insturction compatibility: "
460 << L.getName() <<
"\n");
463 auto unsupported_insts = checkUnsupportedInst(L, AM, AR);
466 if (unsupported_insts.hasValue()) {
468 for (
auto inst : *unsupported_insts) {
476 friend AnalysisInfoMixin<VerifyInstAvailabilityPass<VerifyPassTy>>;
492 LoopStandardAnalysisResults &AR)
494 auto LN = LoopNest::getLoopNest(L, AR.SE);
495 auto innermost = LN->getInnermostLoop();
498 auto *model = MM.getModel();
502 for (
auto &BB : innermost->getBlocks()) {
503 for (
auto &I : *BB) {
504 auto *imap = model->isSupported(&I);
506 unsupported.emplace_back(&I);
511 if (unsupported.size() == 0) {
514 return Optional<InstList>(std::move(unsupported));
520 template <
typename VerifyPassTy>
521 AnalysisKey VerifyInstAvailabilityPass<VerifyPassTy>::Key;
530 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
533 FunctionAnalysisManager &AM);
538 #endif //VerifyPass_H
Definition: VerifyPass.hpp:409
@ InterLoopDep
Checking the loop has inter-loop-dependency.
Definition: OptionPlugin.cpp:128
iterator_range< kernel_iterator > kernels()
Definition: VerifyPass.hpp:290
KernelList::iterator kernel_iterator
Definition: VerifyPass.hpp:266
@ FunctionCall
Checking if the loop contains function call.
bool bool_operator_impl() override
bool_operator
Definition: VerifyPass.hpp:434
SimpleVerifyResult()
Definition: VerifyPass.hpp:326
An abstract class for the verification information.
Definition: VerifyPass.hpp:96
std::string msg
Definition: VerifyPass.hpp:342
virtual VerificationKind getKind() const
get the kind of derived class
Definition: VerifyPass.hpp:149
virtual bool bool_operator_impl()
An actual impelementation for casting to Boolean.
Definition: VerifyPass.hpp:157
StringRef getName() const
Definition: VerifyPass.hpp:305
InstAvailability()
Definition: VerifyPass.hpp:411
static const char * name
Definition: VerifyPass.hpp:343
#define INFO_DEBUG_PREFIX
Definition: common.hpp:39
A function pass to verify the kernel for Decoupled CGRA.
Definition: VerifyPass.hpp:397
@ Conditional
Checking if the loop contains condional part or not.
static AnalysisKey Key
Definition: VerifyPass.hpp:404
std::map< Loop *, LoopVerifyResult > loop_verify_results
Definition: VerifyPass.hpp:315
@ MemoryAccess
Checking each memory access meets the allowed access pattern.
virtual void print(raw_ostream &OS) const =0
An abstract method to print the verification result.
SmallVector< Loop * > LoopList
Definition: VerifyPass.hpp:357
static bool classof(const VerifyResultBase *R)
Definition: VerifyPass.hpp:293
Optional< InstList > checkUnsupportedInst(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR)
default routine to check whether the kernel contains unspported instructions
Definition: VerifyPass.hpp:491
CmpInst * getBackCondition(Loop *L)
Definition: VerifyPass.hpp:203
kernel_iterator kernel_end()
Definition: VerifyPass.hpp:287
SmallVector< Loop * > valid_kernels
Definition: VerifyPass.hpp:262
@ FunctionSummary
Summary of the verfication for a function including kernels.
LoopVerifyResult()
Construct a new Verify Result object.
Definition: VerifyPass.hpp:180
@ KernelSummary
Summary of the loop verification.
void setBackBranch(Loop *L, BranchInst *B)
Definition: VerifyPass.hpp:211
A function pass to verify the kernel for TimeMultiplexed CGRA.
Definition: VerifyPass.hpp:381
void dump()
dump the verification result like as debugging in LLVM
Definition: VerifyPass.hpp:128
Simple verification result only with a verification message.
Definition: VerifyPass.hpp:324
SmallVector< Loop * > KernelList
Definition: VerifyPass.hpp:265
void setVio()
mark this result as violated
Definition: VerifyPass.hpp:143
void setMessage(StringRef msg)
Definition: VerifyPass.hpp:330
Definition: AGVerifyPass.hpp:50
A template class for verify the instruction availability It is possible to customize the routine with...
Definition: VerifyPass.hpp:449
StringRef getName() const
Definition: VerifyPass.hpp:227
A derived class from VerifyResultBase bunding all kernel verification result.
Definition: VerifyPass.hpp:260
A derived class from VerifyResultBase bundling detailed results for each verification type.
Definition: VerifyPass.hpp:172
result_iterator result_begin()
Definition: VerifyPass.hpp:215
BranchInst * getBackBranch(Loop *L)
Definition: VerifyPass.hpp:195
void setResult(VerifyResultBase *R)
Set the verification result for a kind of rule.
Definition: VerifyPass.hpp:191
SimpleVerifyResult(std::string msg)
Definition: VerifyPass.hpp:327
@ MaxNestedLevel
Checking the kernel exceeds the maximumn nested level.
kernel_iterator kernel_begin()
Definition: VerifyPass.hpp:283
@ Decoupling
Checking the loop kernel is able to be decoupled.
VerificationKind kind
Definition: VerifyPass.hpp:164
static AnalysisKey Key
Definition: VerifyPass.hpp:388
int getNumKernels()
Definition: VerifyPass.hpp:309
DenseMap< int, VerifyResultBase * >::iterator result_iterator
Definition: VerifyPass.hpp:175
SmallVector< Instruction * > InstList
Definition: VerifyPass.hpp:478
static bool classof(const VerifyResultBase *R)
Definition: VerifyPass.hpp:183
VerifyResult()
Construct a new Verify Result object.
Definition: VerifyPass.hpp:271
SmallPtrSet< Instruction *, 32 > unsupported
Definition: VerifyPass.hpp:438
A proxy to access model manager from loop passes.
Definition: CGRAOmpPass.hpp:136
A module pass to verify all annotated functions.
Definition: VerifyPass.hpp:528
result_iterator result_end()
Definition: VerifyPass.hpp:219
void print(raw_ostream &OS) const
An abstract method to print the verification result.
Definition: VerifyPass.hpp:333
Result run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR)
Definition: VerifyPass.hpp:454
VerifyResultBase(VerificationKind kind)
Construct a new Verify Result Base object.
Definition: VerifyPass.hpp:101
a template for verification pass
Definition: VerifyPass.hpp:355
static AnalysisKey Key
Definition: VerifyPass.hpp:477
iterator_range< result_iterator > results()
Definition: VerifyPass.hpp:223
void add_unsupported(Instruction *I)
Definition: VerifyPass.hpp:419
void registerKernel(Loop *L, LoopVerifyResult LVR)
register a valid loop kernel for the target CGRA
Definition: VerifyPass.hpp:278
@ NestedPerfectly
Checking if the loop nested structure is perfectly nested or not.
DenseMap< int, VerifyResultBase * > each_result
Definition: VerifyPass.hpp:242
StringRef getName() const
Definition: VerifyPass.hpp:337
friend raw_ostream & operator<<(raw_ostream &OS, const VerifyResultBase &v)
support << operator to show the verification result
Definition: VerifyPass.hpp:132
StringRef getName() const
Definition: VerifyPass.hpp:423
VerificationKind
Kind of verification.
Definition: VerifyPass.hpp:64
DenseMap< Loop *, BranchInst * > back_branch_list
Definition: VerifyPass.hpp:252
LoopVerifyResult * getLoopVerifyResult(Loop *L)
Definition: VerifyPass.hpp:297
VerifyResultBase * getResult(VerificationKind kind)
Definition: VerifyPass.hpp:231