LLVM 22.0.0git
Analysis.h
Go to the documentation of this file.
1//===- CodeGen/Analysis.h - CodeGen LLVM IR Analysis Utilities --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares several CodeGen-specific LLVM IR analysis utilities.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CODEGEN_ANALYSIS_H
14#define LLVM_CODEGEN_ANALYSIS_H
15
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseMap.h"
20
21namespace llvm {
22template <typename T> class SmallVectorImpl;
23class GlobalValue;
24class LLT;
26class MachineFunction;
28class TargetLowering;
29class TargetMachine;
30struct EVT;
31
32/// Compute the linearized index of a member in a nested
33/// aggregate/struct/array.
34///
35/// Given an LLVM IR aggregate type and a sequence of insertvalue or
36/// extractvalue indices that identify a member, return the linearized index of
37/// the start of the member, i.e the number of element in memory before the
38/// sought one. This is disconnected from the number of bytes.
39///
40/// \param Ty is the type indexed by \p Indices.
41/// \param Indices is an optional pointer in the indices list to the current
42/// index.
43/// \param IndicesEnd is the end of the indices list.
44/// \param CurIndex is the current index in the recursion.
45///
46/// \returns \p CurIndex plus the linear index in \p Ty the indices list.
47unsigned ComputeLinearIndex(Type *Ty,
48 const unsigned *Indices,
49 const unsigned *IndicesEnd,
50 unsigned CurIndex = 0);
51
52inline unsigned ComputeLinearIndex(Type *Ty,
53 ArrayRef<unsigned> Indices,
54 unsigned CurIndex = 0) {
55 return ComputeLinearIndex(Ty, Indices.begin(), Indices.end(), CurIndex);
56}
57
58/// Given an LLVM IR type, compute non-aggregate subtypes. Optionally also
59/// compute their offsets.
60void ComputeValueTypes(const DataLayout &DL, Type *Ty,
61 SmallVectorImpl<Type *> &Types,
62 SmallVectorImpl<TypeSize> *Offsets = nullptr,
63 TypeSize StartingOffset = TypeSize::getZero());
64
65/// ComputeValueVTs - Given an LLVM IR type, compute a sequence of
66/// EVTs that represent all the individual underlying
67/// non-aggregate types that comprise it.
68///
69/// If Offsets is non-null, it points to a vector to be filled in
70/// with the in-memory offsets of each of the individual values.
71///
72void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty,
73 SmallVectorImpl<EVT> &ValueVTs,
74 SmallVectorImpl<EVT> *MemVTs,
75 SmallVectorImpl<TypeSize> *Offsets = nullptr,
76 TypeSize StartingOffset = TypeSize::getZero());
77void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty,
78 SmallVectorImpl<EVT> &ValueVTs,
79 SmallVectorImpl<EVT> *MemVTs,
80 SmallVectorImpl<uint64_t> *FixedOffsets,
81 uint64_t StartingOffset);
82
83/// Variant of ComputeValueVTs that don't produce memory VTs.
84inline void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL,
85 Type *Ty, SmallVectorImpl<EVT> &ValueVTs,
86 SmallVectorImpl<TypeSize> *Offsets = nullptr,
87 TypeSize StartingOffset = TypeSize::getZero()) {
88 ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, Offsets, StartingOffset);
89}
90inline void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL,
91 Type *Ty, SmallVectorImpl<EVT> &ValueVTs,
92 SmallVectorImpl<uint64_t> *FixedOffsets,
93 uint64_t StartingOffset) {
94 ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, FixedOffsets, StartingOffset);
95}
96
97/// computeValueLLTs - Given an LLVM IR type, compute a sequence of
98/// LLTs that represent all the individual underlying
99/// non-aggregate types that comprise it.
100///
101/// If Offsets is non-null, it points to a vector to be filled in
102/// with the in-memory offsets of each of the individual values.
103///
104void computeValueLLTs(const DataLayout &DL, Type &Ty,
105 SmallVectorImpl<LLT> &ValueTys,
106 SmallVectorImpl<uint64_t> *Offsets = nullptr,
107 uint64_t StartingOffset = 0);
108
109/// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
110GlobalValue *ExtractTypeInfo(Value *V);
111
112/// getFCmpCondCode - Return the ISD condition code corresponding to
113/// the given LLVM IR floating-point condition code. This includes
114/// consideration of global floating-point math flags.
115///
117
118/// getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats,
119/// return the equivalent code if we're allowed to assume that NaNs won't occur.
121
122/// getICmpCondCode - Return the ISD condition code corresponding to
123/// the given LLVM IR integer condition code.
125
126/// getICmpCondCode - Return the LLVM IR integer condition code
127/// corresponding to the given ISD integer condition code.
129
130/// Test if the given instruction is in a position to be optimized
131/// with a tail-call. This roughly means that it's in a block with
132/// a return and there's nothing that needs to be scheduled
133/// between it and the return.
134///
135/// This function only tests target-independent requirements.
136bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM,
137 bool ReturnsFirstArg = false);
138
139/// Test if given that the input instruction is in the tail call position, if
140/// there is an attribute mismatch between the caller and the callee that will
141/// inhibit tail call optimizations.
142/// \p AllowDifferingSizes is an output parameter which, if forming a tail call
143/// is permitted, determines whether it's permitted only if the size of the
144/// caller's and callee's return types match exactly.
145bool attributesPermitTailCall(const Function *F, const Instruction *I,
146 const ReturnInst *Ret,
147 const TargetLoweringBase &TLI,
148 bool *AllowDifferingSizes = nullptr);
149
150/// Test if given that the input instruction is in the tail call position if the
151/// return type or any attributes of the function will inhibit tail call
152/// optimization.
153bool returnTypeIsEligibleForTailCall(const Function *F, const Instruction *I,
154 const ReturnInst *Ret,
155 const TargetLoweringBase &TLI,
156 bool ReturnsFirstArg = false);
157
158/// Returns true if the parent of \p CI returns CI's first argument after
159/// calling \p CI.
160bool funcReturnsFirstArgOfCall(const CallInst &CI);
161
162DenseMap<const MachineBasicBlock *, int>
163getEHScopeMembership(const MachineFunction &MF);
164
165} // End llvm namespace
166
167#endif
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the DenseMap class.
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
iterator end() const
Definition ArrayRef.h:136
iterator begin() const
Definition ArrayRef.h:135
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:678
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
Primary interface to the complete machine description for the target machine.
static constexpr TypeSize getZero()
Definition TypeSize.h:349
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
CallInst * Call
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This is an optimization pass for GlobalISel generic memory operations.
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:241
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
bool returnTypeIsEligibleForTailCall(const Function *F, const Instruction *I, const ReturnInst *Ret, const TargetLoweringBase &TLI, bool ReturnsFirstArg=false)
Test if given that the input instruction is in the tail call position if the return type or any attri...
Definition Analysis.cpp:652
void computeValueLLTs(const DataLayout &DL, Type &Ty, SmallVectorImpl< LLT > &ValueTys, SmallVectorImpl< uint64_t > *Offsets=nullptr, uint64_t StartingOffset=0)
computeValueLLTs - Given an LLVM IR type, compute a sequence of LLTs that represent all the individua...
Definition Analysis.cpp:149
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred)
getFCmpCondCode - Return the ISD condition code corresponding to the given LLVM IR floating-point con...
Definition Analysis.cpp:207
bool attributesPermitTailCall(const Function *F, const Instruction *I, const ReturnInst *Ret, const TargetLoweringBase &TLI, bool *AllowDifferingSizes=nullptr)
Test if given that the input instruction is in the tail call position, if there is an attribute misma...
Definition Analysis.cpp:592
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:543
ISD::CondCode getFCmpCodeWithoutNaN(ISD::CondCode CC)
getFCmpCodeWithoutNaN - Given an ISD condition code comparing floats, return the equivalent code if w...
Definition Analysis.cpp:229
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:723
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition Analysis.cpp:185
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
Definition Analysis.cpp:33
DenseMap< const MachineBasicBlock *, int > getEHScopeMembership(const MachineFunction &MF)
Definition Analysis.cpp:761
Extended Value Type.
Definition ValueTypes.h:35