source: icGREP/icgrep-devel/icgrep/kernels/optimizationbranch.h @ 6289

Last change on this file since 6289 was 6289, checked in by cameron, 7 months ago

Initial version of working OptimizationBranch?

File size: 2.2 KB
Line 
1#ifndef OPTIMIZATIONBRANCH_H
2#define OPTIMIZATIONBRANCH_H
3
4#include <kernels/kernel.h>
5
6namespace llvm { class Value; }
7
8namespace kernel {
9
10struct OptimizationBranchCompiler;
11
12class OptimizationBranch final : public Kernel {
13    friend class OptimizationBranchBuilder;
14public:
15
16    static bool classof(const Kernel * const k) {
17        switch (k->getTypeId()) {
18            case TypeId::OptimizationBranch:
19                return true;
20            default:
21                return false;
22        }
23    }
24
25    const static std::string CONDITION_TAG;
26
27    ~OptimizationBranch();
28
29protected:
30
31    OptimizationBranch(const std::unique_ptr<KernelBuilder> & b,
32                       std::string && signature,
33                       not_null<Relationship *> condition,
34                       not_null<Kernel *> nonZeroKernel,
35                       not_null<Kernel *> allZeroKernel,
36                       Bindings && stream_inputs,
37                       Bindings && stream_outputs,
38                       Bindings && scalar_inputs,
39                       Bindings && scalar_outputs);
40
41    void addKernelDeclarations(const std::unique_ptr<KernelBuilder> & b) final;
42
43    void generateInitializeMethod(const std::unique_ptr<KernelBuilder> & b) final;
44
45    void generateKernelMethod(const std::unique_ptr<KernelBuilder> & b) final;
46
47    void generateFinalizeMethod(const std::unique_ptr<KernelBuilder> & b) final;
48
49private:
50
51    llvm::Value * getItemCountIncrement(const std::unique_ptr<KernelBuilder> & b, const Binding & binding,
52                                        llvm::Value * const first, llvm::Value * const last,
53                                        llvm::Value * const defaultValue = nullptr) const;
54
55    void callKernel(const std::unique_ptr<KernelBuilder> & b,
56                    const Kernel * const kernel, llvm::Value * const first, llvm::Value * const last,
57                    llvm::PHINode * const terminatedPhi);
58
59private:
60
61    Relationship * const                                mCondition;
62    Kernel * const                                      mNonZeroKernel;
63    Kernel * const                                      mAllZeroKernel;
64    mutable std::unique_ptr<OptimizationBranchCompiler> mCompiler;
65};
66
67}
68
69#endif // OPTIMIZATIONBRANCH_H
Note: See TracBrowser for help on using the repository browser.