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
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2025 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#include "common/LLVMWarningsPush.hpp"
#include <llvm/IR/Instructions.h>
#include <llvm/Pass.h>
#include <llvm/ADT/DenseSet.h>
#include <llvm/ADT/SetVector.h>
#include "common/LLVMWarningsPop.hpp"
namespace llvm {
class BasicBlock;
class DominatorTree;
class Instruction;
class LoopInfo;
} // namespace llvm
namespace IGC {
class AllocationLivenessAnalyzer : public llvm::FunctionPass {
public:
struct LivenessData {
llvm::Instruction *lifetimeStart = nullptr;
llvm::SmallVector<llvm::Instruction *> lifetimeEndInstructions;
struct Edge {
llvm::BasicBlock *from;
llvm::BasicBlock *to;
};
llvm::SmallVector<Edge> lifetimeEndEdges;
llvm::DenseSet<llvm::BasicBlock *> bbIn;
llvm::DenseSet<llvm::BasicBlock *> bbOut;
LivenessData(llvm::Instruction *allocationInstruction, llvm::SetVector<llvm::Instruction *> &&usersOfAllocation,
const llvm::LoopInfo &LI, const llvm::DominatorTree &DT,
llvm::BasicBlock *userDominatorBlock = nullptr,
llvm::SetVector<llvm::Instruction *> &&lifetimeLeakingUsers = {});
bool OverlapsWith(const LivenessData &LD) const;
bool ContainsInstruction(const llvm::Instruction &I) const;
};
AllocationLivenessAnalyzer(char &pid) : llvm::FunctionPass(pid) {}
protected:
LivenessData ProcessInstruction(llvm::Instruction *I, llvm::DominatorTree &DT, llvm::LoopInfo &LI);
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
virtual void getAdditionalAnalysisUsage(llvm::AnalysisUsage &AU) const = 0;
};
namespace Provenance {
bool tryFindPointerOrigin(llvm::Value *ptr, llvm::SmallVectorImpl<llvm::Instruction *> &origins);
}
} // namespace IGC
|