File: GatingSimilarSamples.hpp

package info (click to toggle)
intel-graphics-compiler 1.0.17791.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 102,312 kB
  • sloc: cpp: 935,343; lisp: 286,143; ansic: 16,196; python: 3,279; yacc: 2,487; lex: 1,642; pascal: 300; sh: 174; makefile: 27
file content (70 lines) | stat: -rw-r--r-- 2,532 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*========================== begin_copyright_notice ============================

Copyright (C) 2017-2021 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ===========================*/

#pragma once

#include "Compiler/IGCPassSupport.h"
#include "Compiler/CodeGenPublic.h"
#include "common/LLVMWarningsPush.hpp"
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Support/raw_ostream.h"
#include "common/LLVMWarningsPop.hpp"


namespace IGC
{
    //===----------------------------------------------------------------------===//
    //
    // Optimization pass.
    //
    // It detects sample instructions in a BB, that differ only by coordinates
    // argument from a sample instruction used at the beginning of the BB.
    // In that case those similar sample instructions can be "gated": surrounded by if-then, where they
    // are placed in the "if-then" block, and skipped otherwise.
    //
    //===----------------------------------------------------------------------===//
    class GatingSimilarSamples : public llvm::FunctionPass
    {
    public:
        static char ID;
        GatingSimilarSamples() : llvm::FunctionPass(ID)
        {
            initializeGatingSimilarSamplesPass(*llvm::PassRegistry::getPassRegistry());
        }
        virtual bool runOnFunction(llvm::Function& F) override;
        void getAnalysisUsage(llvm::AnalysisUsage& AU) const override
        {
            AU.addRequired<IGC::CodeGenContextWrapper>();
        }

        /// @brief  Provides name of pass
        virtual llvm::StringRef getPassName() const override
        {
            return "GatingSimilarSamples";
        }

    private:
        llvm::BasicBlock* BB = nullptr;
        llvm::Instruction* motionSample = nullptr;
        llvm::Instruction* texelSample = nullptr;
        llvm::Instruction* resultInst = nullptr;

        //motion.xy will be the gating value
        llvm::Value* gatingValue_mul1 = nullptr; //motion.x
        llvm::Value* gatingValue_mul2 = nullptr; //motion.y
        std::vector<llvm::Instruction*> similarSampleInsts{};
        bool areSampleInstructionsSimilar(llvm::Instruction*, llvm::Instruction*);
        bool checkAndSaveSimilarSampleInsts();
        bool setOrCmpGatingValue(llvm::Value*& gatingValueToCmp1, llvm::Instruction* mulInst, const llvm::Instruction* texelSampleInst);
        bool findAndSetCommonGatingValue();
    };

    llvm::FunctionPass* CreateGatingSimilarSamples();
}