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
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2017-2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#pragma once
#include "common/LLVMWarningsPush.hpp"
#include <llvm/IR/Instructions.h>
#include <llvm/IR/LegacyPassManager.h>
#include "common/LLVMWarningsPop.hpp"
#include <list>
#include "Stats.hpp"
#include <string.h>
namespace IGC {
namespace Debug {
class Dump;
}
class CodeGenContext;
class IGCPassManager : public llvm::legacy::PassManager {
public:
IGCPassManager(CodeGenContext *ctx, const char *name = "") : m_pContext(ctx), m_name(name) {}
void add(llvm::Pass *P);
private:
CodeGenContext *const m_pContext;
const std::string m_name;
std::list<Debug::Dump> m_irDumps;
void addPrintPass(llvm::Pass *P, bool isBefore);
bool isPrintBefore(llvm::Pass *P);
bool isPrintAfter(llvm::Pass *P);
// List: comma/semicolon-separate list of names.
// Return true if N is in the list.
bool isInList(const llvm::StringRef &N, const llvm::StringRef &List) const;
};
} // namespace IGC
void DumpLLVMIR(IGC::CodeGenContext *pContext, const char *dumpName);
void DumpHashToOptions(const ShaderHash &, const ShaderType);
class InlineHelper {
private:
// create a map of (type, array size, address space to alloca instructions)
using AllocaMap =
llvm::MapVector<std::tuple<llvm::Type *, uint64_t, uint32_t>, llvm::SmallVector<llvm::AllocaInst *>>;
llvm::DenseMap<llvm::Function *, AllocaMap> m_InlinedStaticArrayAllocas;
#if defined(_RELEASE_INTERNAL) || defined(_DEBUG)
llvm::Function *m_calledFunction = nullptr;
#endif
public:
InlineHelper() = default;
~InlineHelper() = default;
void InlineAndOptimize(llvm::CallInst *callInst);
};
|