1//===- AutoInitRemark.h - Auto-init remark analysis -*- C++ -------------*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Provide more information about instructions with a "auto-init"
11// !annotation metadata.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TRANSFORMS_UTILS_AUTOINITREMARK_H
16#define LLVM_TRANSFORMS_UTILS_AUTOINITREMARK_H
17
18#include "llvm/ADT/StringRef.h"
19#include "llvm/Analysis/TargetLibraryInfo.h"
20
21namespace llvm {
22
23class CallInst;
24class DataLayout;
25class Instruction;
26class IntrinsicInst;
27class Value;
28class OptimizationRemarkEmitter;
29class OptimizationRemarkMissed;
30class StoreInst;
31
32// FIXME: Once we get to more remarks like this one, we need to re-evaluate how
33// much of this logic should actually go into the remark emitter.
34struct AutoInitRemark {
35 OptimizationRemarkEmitter &ORE;
36 StringRef RemarkPass;
37 const DataLayout &DL;
38 const TargetLibraryInfo &TLI;
39
40 AutoInitRemark(OptimizationRemarkEmitter &ORE, StringRef RemarkPass,
41 const DataLayout &DL, const TargetLibraryInfo &TLI)
42 : ORE(ORE), RemarkPass(RemarkPass), DL(DL), TLI(TLI) {}
43
44 /// Emit a remark using information from the store's destination, size, etc.
45 void inspectStore(StoreInst &SI);
46 /// Emit a generic auto-init remark.
47 void inspectUnknown(Instruction &I);
48 /// Emit a remark using information from known intrinsic calls.
49 void inspectIntrinsicCall(IntrinsicInst &II);
50 /// Emit a remark using information from known function calls.
51 void inspectCall(CallInst &CI);
52
53private:
54 /// Add callee information to a remark: whether it's known, the function name,
55 /// etc.
56 template <typename FTy>
57 void inspectCallee(FTy F, bool KnownLibCall, OptimizationRemarkMissed &R);
58 /// Add operand information to a remark based on knowledge we have for known
59 /// libcalls.
60 void inspectKnownLibCall(CallInst &CI, LibFunc LF,
61 OptimizationRemarkMissed &R);
62 /// Add the memory operation size to a remark.
63 void inspectSizeOperand(Value *V, OptimizationRemarkMissed &R);
64
65 struct VariableInfo {
66 Optional<StringRef> Name;
67 Optional<uint64_t> Size;
68 bool isEmpty() const { return !Name && !Size; }
69 };
70 /// Gather more information about \p V as a variable. This can be debug info,
71 /// information from the alloca, etc. Since \p V can represent more than a
72 /// single variable, they will all be added to the remark.
73 void inspectDst(Value *Dst, OptimizationRemarkMissed &R);
74 void inspectVariable(const Value *V, SmallVectorImpl<VariableInfo> &Result);
75};
76
77} // namespace llvm
78
79#endif
80