Viewing file: MemoryOpRemark.h (4.16 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- MemoryOpRemark.h - Memory operation remark analysis -*- C++ ------*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Provide more information about instructions that copy, move, or initialize // memory, including those with a "auto-init" !annotation metadata. // //===----------------------------------------------------------------------===//
#ifndef LLVM_TRANSFORMS_UTILS_MEMORYOPREMARK_H #define LLVM_TRANSFORMS_UTILS_MEMORYOPREMARK_H
#include "llvm/ADT/StringRef.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/DiagnosticInfo.h" #include <optional>
namespace llvm {
class CallInst; class DataLayout; class DiagnosticInfoIROptimization; class Instruction; class IntrinsicInst; class Value; class OptimizationRemarkEmitter; class StoreInst;
// FIXME: Once we get to more remarks like this one, we need to re-evaluate how // much of this logic should actually go into the remark emitter. struct MemoryOpRemark { OptimizationRemarkEmitter &ORE; StringRef RemarkPass; const DataLayout &DL; const TargetLibraryInfo &TLI;
MemoryOpRemark(OptimizationRemarkEmitter &ORE, StringRef RemarkPass, const DataLayout &DL, const TargetLibraryInfo &TLI) : ORE(ORE), RemarkPass(RemarkPass), DL(DL), TLI(TLI) {}
virtual ~MemoryOpRemark();
/// \return true iff the instruction is understood by MemoryOpRemark. static bool canHandle(const Instruction *I, const TargetLibraryInfo &TLI);
void visit(const Instruction *I);
protected: virtual std::string explainSource(StringRef Type) const;
enum RemarkKind { RK_Store, RK_Unknown, RK_IntrinsicCall, RK_Call }; virtual StringRef remarkName(RemarkKind RK) const;
virtual DiagnosticKind diagnosticKind() const { return DK_OptimizationRemarkAnalysis; }
private: template<typename ...Ts> std::unique_ptr<DiagnosticInfoIROptimization> makeRemark(Ts... Args);
/// Emit a remark using information from the store's destination, size, etc. void visitStore(const StoreInst &SI); /// Emit a generic auto-init remark. void visitUnknown(const Instruction &I); /// Emit a remark using information from known intrinsic calls. void visitIntrinsicCall(const IntrinsicInst &II); /// Emit a remark using information from known function calls. void visitCall(const CallInst &CI);
/// Add callee information to a remark: whether it's known, the function name, /// etc. template <typename FTy> void visitCallee(FTy F, bool KnownLibCall, DiagnosticInfoIROptimization &R); /// Add operand information to a remark based on knowledge we have for known /// libcalls. void visitKnownLibCall(const CallInst &CI, LibFunc LF, DiagnosticInfoIROptimization &R); /// Add the memory operation size to a remark. void visitSizeOperand(Value *V, DiagnosticInfoIROptimization &R);
struct VariableInfo { std::optional<StringRef> Name; std::optional<uint64_t> Size; bool isEmpty() const { return !Name && !Size; } }; /// Gather more information about \p V as a variable. This can be debug info, /// information from the alloca, etc. Since \p V can represent more than a /// single variable, they will all be added to the remark. void visitPtr(Value *V, bool IsSrc, DiagnosticInfoIROptimization &R); void visitVariable(const Value *V, SmallVectorImpl<VariableInfo> &Result); };
/// Special case for -ftrivial-auto-var-init remarks. struct AutoInitRemark : public MemoryOpRemark { AutoInitRemark(OptimizationRemarkEmitter &ORE, StringRef RemarkPass, const DataLayout &DL, const TargetLibraryInfo &TLI) : MemoryOpRemark(ORE, RemarkPass, DL, TLI) {}
/// \return true iff the instruction is understood by AutoInitRemark. static bool canHandle(const Instruction *I);
protected: std::string explainSource(StringRef Type) const override; StringRef remarkName(RemarkKind RK) const override; DiagnosticKind diagnosticKind() const override { return DK_OptimizationRemarkMissed; } };
} // namespace llvm
#endif
|