mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-08 21:10:35 +00:00
[CodeGen] Fix some Clang-tidy modernize-use-using and Include What You Use warnings; other minor fixes (NFC).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304621 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9a4d5c41c3
commit
5067e6a434
@ -1,4 +1,4 @@
|
||||
//===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===//
|
||||
//===- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -15,35 +15,72 @@
|
||||
#ifndef LLVM_CODEGEN_SELECTIONDAG_H
|
||||
#define LLVM_CODEGEN_SELECTIONDAG_H
|
||||
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/ilist.h"
|
||||
#include "llvm/ADT/iterator.h"
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/CodeGen/DAGCombine.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include "llvm/Support/ArrayRecycler.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/RecyclingAllocator.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class BlockAddress;
|
||||
class Constant;
|
||||
class ConstantFP;
|
||||
class ConstantInt;
|
||||
class DataLayout;
|
||||
struct fltSemantics;
|
||||
class GlobalValue;
|
||||
struct KnownBits;
|
||||
class LLVMContext;
|
||||
class MachineBasicBlock;
|
||||
class MachineConstantPoolValue;
|
||||
class MachineFunction;
|
||||
class MDNode;
|
||||
class MCSymbol;
|
||||
class OptimizationRemarkEmitter;
|
||||
class SDDbgValue;
|
||||
class TargetLowering;
|
||||
class SelectionDAG;
|
||||
class SelectionDAGTargetInfo;
|
||||
class TargetLowering;
|
||||
class TargetMachine;
|
||||
class TargetSubtargetInfo;
|
||||
class Value;
|
||||
|
||||
class SDVTListNode : public FoldingSetNode {
|
||||
friend struct FoldingSetTrait<SDVTListNode>;
|
||||
|
||||
/// A reference to an Interned FoldingSetNodeID for this node.
|
||||
/// The Allocator in SelectionDAG holds the data.
|
||||
/// SDVTList contains all types which are frequently accessed in SelectionDAG.
|
||||
@ -55,11 +92,13 @@ class SDVTListNode : public FoldingSetNode {
|
||||
/// The hash value for SDVTList is fixed, so cache it to avoid
|
||||
/// hash calculation.
|
||||
unsigned HashValue;
|
||||
|
||||
public:
|
||||
SDVTListNode(const FoldingSetNodeIDRef ID, const EVT *VT, unsigned int Num) :
|
||||
FastID(ID), VTs(VT), NumVTs(Num) {
|
||||
HashValue = ID.ComputeHash();
|
||||
}
|
||||
|
||||
SDVTList getSDVTList() {
|
||||
SDVTList result = {VTs, NumVTs};
|
||||
return result;
|
||||
@ -72,12 +111,14 @@ template<> struct FoldingSetTrait<SDVTListNode> : DefaultFoldingSetTrait<SDVTLis
|
||||
static void Profile(const SDVTListNode &X, FoldingSetNodeID& ID) {
|
||||
ID = X.FastID;
|
||||
}
|
||||
|
||||
static bool Equals(const SDVTListNode &X, const FoldingSetNodeID &ID,
|
||||
unsigned IDHash, FoldingSetNodeID &TempID) {
|
||||
if (X.HashValue != IDHash)
|
||||
return false;
|
||||
return ID == X.FastID;
|
||||
}
|
||||
|
||||
static unsigned ComputeHash(const SDVTListNode &X, FoldingSetNodeID &TempID) {
|
||||
return X.HashValue;
|
||||
}
|
||||
@ -104,13 +145,13 @@ class SDDbgInfo {
|
||||
BumpPtrAllocator Alloc;
|
||||
SmallVector<SDDbgValue*, 32> DbgValues;
|
||||
SmallVector<SDDbgValue*, 32> ByvalParmDbgValues;
|
||||
typedef DenseMap<const SDNode*, SmallVector<SDDbgValue*, 2> > DbgValMapType;
|
||||
using DbgValMapType = DenseMap<const SDNode *, SmallVector<SDDbgValue *, 2>>;
|
||||
DbgValMapType DbgValMap;
|
||||
|
||||
void operator=(const SDDbgInfo&) = delete;
|
||||
SDDbgInfo(const SDDbgInfo&) = delete;
|
||||
public:
|
||||
SDDbgInfo() {}
|
||||
SDDbgInfo() = default;
|
||||
SDDbgInfo(const SDDbgInfo &) = delete;
|
||||
SDDbgInfo &operator=(const SDDbgInfo &) = delete;
|
||||
|
||||
void add(SDDbgValue *V, const SDNode *Node, bool isParameter) {
|
||||
if (isParameter) {
|
||||
@ -144,14 +185,14 @@ public:
|
||||
return ArrayRef<SDDbgValue*>();
|
||||
}
|
||||
|
||||
typedef SmallVectorImpl<SDDbgValue*>::iterator DbgIterator;
|
||||
using DbgIterator = SmallVectorImpl<SDDbgValue*>::iterator;
|
||||
|
||||
DbgIterator DbgBegin() { return DbgValues.begin(); }
|
||||
DbgIterator DbgEnd() { return DbgValues.end(); }
|
||||
DbgIterator ByvalParmDbgBegin() { return ByvalParmDbgValues.begin(); }
|
||||
DbgIterator ByvalParmDbgEnd() { return ByvalParmDbgValues.end(); }
|
||||
};
|
||||
|
||||
class SelectionDAG;
|
||||
void checkForCycles(const SelectionDAG *DAG, bool force = false);
|
||||
|
||||
/// This is used to represent a portion of an LLVM function in a low-level
|
||||
@ -167,8 +208,8 @@ void checkForCycles(const SelectionDAG *DAG, bool force = false);
|
||||
///
|
||||
class SelectionDAG {
|
||||
const TargetMachine &TM;
|
||||
const SelectionDAGTargetInfo *TSI;
|
||||
const TargetLowering *TLI;
|
||||
const SelectionDAGTargetInfo *TSI = nullptr;
|
||||
const TargetLowering *TLI = nullptr;
|
||||
MachineFunction *MF;
|
||||
LLVMContext *Context;
|
||||
CodeGenOpt::Level OptLevel;
|
||||
@ -188,9 +229,9 @@ class SelectionDAG {
|
||||
|
||||
/// The AllocatorType for allocating SDNodes. We use
|
||||
/// pool allocation with recycling.
|
||||
typedef RecyclingAllocator<BumpPtrAllocator, SDNode, sizeof(LargestSDNode),
|
||||
alignof(MostAlignedSDNode)>
|
||||
NodeAllocatorType;
|
||||
using NodeAllocatorType = RecyclingAllocator<BumpPtrAllocator, SDNode,
|
||||
sizeof(LargestSDNode),
|
||||
alignof(MostAlignedSDNode)>;
|
||||
|
||||
/// Pool allocation for nodes.
|
||||
NodeAllocatorType NodeAllocator;
|
||||
@ -243,9 +284,11 @@ public:
|
||||
|
||||
struct DAGNodeDeletedListener : public DAGUpdateListener {
|
||||
std::function<void(SDNode *, SDNode *)> Callback;
|
||||
|
||||
DAGNodeDeletedListener(SelectionDAG &DAG,
|
||||
std::function<void(SDNode *, SDNode *)> Callback)
|
||||
: DAGUpdateListener(DAG), Callback(std::move(Callback)) {}
|
||||
|
||||
void NodeDeleted(SDNode *N, SDNode *E) override { Callback(N, E); }
|
||||
};
|
||||
|
||||
@ -254,7 +297,7 @@ public:
|
||||
/// have legal types. This is important after type legalization since
|
||||
/// any illegally typed nodes generated after this point will not experience
|
||||
/// type legalization.
|
||||
bool NewNodesMustHaveLegalTypes;
|
||||
bool NewNodesMustHaveLegalTypes = false;
|
||||
|
||||
private:
|
||||
/// DAGUpdateListener is a friend so it can manipulate the listener stack.
|
||||
@ -262,7 +305,7 @@ private:
|
||||
|
||||
/// Linked list of registered DAGUpdateListener instances.
|
||||
/// This stack is maintained by DAGUpdateListener RAII.
|
||||
DAGUpdateListener *UpdateListeners;
|
||||
DAGUpdateListener *UpdateListeners = nullptr;
|
||||
|
||||
/// Implementation of setSubgraphColor.
|
||||
/// Return whether we had to truncate the search.
|
||||
@ -316,11 +359,10 @@ private:
|
||||
Node->OperandList = nullptr;
|
||||
}
|
||||
|
||||
void operator=(const SelectionDAG&) = delete;
|
||||
SelectionDAG(const SelectionDAG&) = delete;
|
||||
|
||||
public:
|
||||
explicit SelectionDAG(const TargetMachine &TM, llvm::CodeGenOpt::Level);
|
||||
explicit SelectionDAG(const TargetMachine &TM, CodeGenOpt::Level);
|
||||
SelectionDAG(const SelectionDAG &) = delete;
|
||||
SelectionDAG &operator=(const SelectionDAG &) = delete;
|
||||
~SelectionDAG();
|
||||
|
||||
/// Prepare this SelectionDAG to process code in the given MachineFunction.
|
||||
@ -364,12 +406,16 @@ public:
|
||||
/// Convenience for setting subgraph color attribute.
|
||||
void setSubgraphColor(SDNode *N, const char *Color);
|
||||
|
||||
typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
|
||||
using allnodes_const_iterator = ilist<SDNode>::const_iterator;
|
||||
|
||||
allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
|
||||
allnodes_const_iterator allnodes_end() const { return AllNodes.end(); }
|
||||
typedef ilist<SDNode>::iterator allnodes_iterator;
|
||||
|
||||
using allnodes_iterator = ilist<SDNode>::iterator;
|
||||
|
||||
allnodes_iterator allnodes_begin() { return AllNodes.begin(); }
|
||||
allnodes_iterator allnodes_end() { return AllNodes.end(); }
|
||||
|
||||
ilist<SDNode>::size_type allnodes_size() const {
|
||||
return AllNodes.size();
|
||||
}
|
||||
@ -475,7 +521,6 @@ public:
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Node creation methods.
|
||||
//
|
||||
|
||||
/// \brief Create a ConstantSDNode wrapping a constant value.
|
||||
/// If VT is a vector type, the constant is splatted into a BUILD_VECTOR.
|
||||
@ -1251,9 +1296,11 @@ public:
|
||||
|
||||
SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); }
|
||||
SDDbgInfo::DbgIterator DbgEnd() { return DbgInfo->DbgEnd(); }
|
||||
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
|
||||
return DbgInfo->ByvalParmDbgBegin();
|
||||
}
|
||||
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgEnd() {
|
||||
return DbgInfo->ByvalParmDbgEnd();
|
||||
}
|
||||
@ -1479,10 +1526,12 @@ private:
|
||||
};
|
||||
|
||||
template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
|
||||
typedef pointer_iterator<SelectionDAG::allnodes_iterator> nodes_iterator;
|
||||
using nodes_iterator = pointer_iterator<SelectionDAG::allnodes_iterator>;
|
||||
|
||||
static nodes_iterator nodes_begin(SelectionDAG *G) {
|
||||
return nodes_iterator(G->allnodes_begin());
|
||||
}
|
||||
|
||||
static nodes_iterator nodes_end(SelectionDAG *G) {
|
||||
return nodes_iterator(G->allnodes_end());
|
||||
}
|
||||
@ -1493,7 +1542,6 @@ SDValue SelectionDAG::getTargetMemSDNode(SDVTList VTs,
|
||||
ArrayRef<SDValue> Ops,
|
||||
const SDLoc &dl, EVT MemVT,
|
||||
MachineMemOperand *MMO) {
|
||||
|
||||
/// Compose node ID and try to find an existing node.
|
||||
FoldingSetNodeID ID;
|
||||
unsigned Opcode =
|
||||
@ -1524,6 +1572,6 @@ SDValue SelectionDAG::getTargetMemSDNode(SDVTList VTs,
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
} // end namespace llvm
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_CODEGEN_SELECTIONDAG_H
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/Support/AlignOf.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
@ -53,14 +54,18 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class SelectionDAG;
|
||||
class APInt;
|
||||
class Constant;
|
||||
template <typename T> struct DenseMapInfo;
|
||||
class GlobalValue;
|
||||
class MachineBasicBlock;
|
||||
class MachineConstantPoolValue;
|
||||
class SDNode;
|
||||
class Value;
|
||||
class MCSymbol;
|
||||
template <typename T> struct DenseMapInfo;
|
||||
class raw_ostream;
|
||||
class SDNode;
|
||||
class SelectionDAG;
|
||||
class Type;
|
||||
class Value;
|
||||
|
||||
void checkForCycles(const SDNode *N, const SelectionDAG *DAG = nullptr,
|
||||
bool force = false);
|
||||
@ -229,13 +234,15 @@ template <> struct isPodLike<SDValue> { static const bool value = true; };
|
||||
/// Allow casting operators to work directly on
|
||||
/// SDValues as if they were SDNode*'s.
|
||||
template<> struct simplify_type<SDValue> {
|
||||
typedef SDNode* SimpleType;
|
||||
using SimpleType = SDNode *;
|
||||
|
||||
static SimpleType getSimplifiedValue(SDValue &Val) {
|
||||
return Val.getNode();
|
||||
}
|
||||
};
|
||||
template<> struct simplify_type<const SDValue> {
|
||||
typedef /*const*/ SDNode* SimpleType;
|
||||
using SimpleType = /*const*/ SDNode *;
|
||||
|
||||
static SimpleType getSimplifiedValue(const SDValue &Val) {
|
||||
return Val.getNode();
|
||||
}
|
||||
@ -330,7 +337,8 @@ private:
|
||||
/// simplify_type specializations - Allow casting operators to work directly on
|
||||
/// SDValues as if they were SDNode*'s.
|
||||
template<> struct simplify_type<SDUse> {
|
||||
typedef SDNode* SimpleType;
|
||||
using SimpleType = SDNode *;
|
||||
|
||||
static SimpleType getSimplifiedValue(SDUse &Val) {
|
||||
return Val.getNode();
|
||||
}
|
||||
@ -511,8 +519,8 @@ protected:
|
||||
|
||||
uint16_t : NumLSBaseSDNodeBits;
|
||||
|
||||
uint16_t IsTruncating : 1;
|
||||
uint16_t IsCompressing : 1;
|
||||
bool IsTruncating : 1;
|
||||
bool IsCompressing : 1;
|
||||
};
|
||||
|
||||
union {
|
||||
@ -695,10 +703,10 @@ public:
|
||||
explicit use_iterator(SDUse *op) : Op(op) {}
|
||||
|
||||
public:
|
||||
typedef std::iterator<std::forward_iterator_tag,
|
||||
SDUse, ptrdiff_t>::reference reference;
|
||||
typedef std::iterator<std::forward_iterator_tag,
|
||||
SDUse, ptrdiff_t>::pointer pointer;
|
||||
using reference = std::iterator<std::forward_iterator_tag,
|
||||
SDUse, ptrdiff_t>::reference;
|
||||
using pointer = std::iterator<std::forward_iterator_tag,
|
||||
SDUse, ptrdiff_t>::pointer;
|
||||
|
||||
use_iterator() = default;
|
||||
use_iterator(const use_iterator &I) : Op(I.Op) {}
|
||||
@ -824,7 +832,7 @@ public:
|
||||
return OperandList[Num];
|
||||
}
|
||||
|
||||
typedef SDUse* op_iterator;
|
||||
using op_iterator = SDUse *;
|
||||
|
||||
op_iterator op_begin() const { return OperandList; }
|
||||
op_iterator op_end() const { return OperandList+NumOperands; }
|
||||
@ -896,7 +904,8 @@ public:
|
||||
return getValueType(ResNo).getSizeInBits();
|
||||
}
|
||||
|
||||
typedef const EVT* value_iterator;
|
||||
using value_iterator = const EVT *;
|
||||
|
||||
value_iterator value_begin() const { return ValueList; }
|
||||
value_iterator value_end() const { return ValueList+NumValues; }
|
||||
|
||||
@ -1822,8 +1831,7 @@ class BlockAddressSDNode : public SDNode {
|
||||
BlockAddressSDNode(unsigned NodeTy, EVT VT, const BlockAddress *ba,
|
||||
int64_t o, unsigned char Flags)
|
||||
: SDNode(NodeTy, 0, DebugLoc(), getSDVTList(VT)),
|
||||
BA(ba), Offset(o), TargetFlags(Flags) {
|
||||
}
|
||||
BA(ba), Offset(o), TargetFlags(Flags) {}
|
||||
|
||||
public:
|
||||
const BlockAddress *getBlockAddress() const { return BA; }
|
||||
@ -2154,7 +2162,7 @@ public:
|
||||
/// instruction selection proper phase.
|
||||
class MachineSDNode : public SDNode {
|
||||
public:
|
||||
typedef MachineMemOperand **mmo_iterator;
|
||||
using mmo_iterator = MachineMemOperand **;
|
||||
|
||||
private:
|
||||
friend class SelectionDAG;
|
||||
@ -2226,8 +2234,8 @@ public:
|
||||
};
|
||||
|
||||
template <> struct GraphTraits<SDNode*> {
|
||||
typedef SDNode *NodeRef;
|
||||
typedef SDNodeIterator ChildIteratorType;
|
||||
using NodeRef = SDNode *;
|
||||
using ChildIteratorType = SDNodeIterator;
|
||||
|
||||
static NodeRef getEntryNode(SDNode *N) { return N; }
|
||||
|
||||
@ -2244,12 +2252,12 @@ template <> struct GraphTraits<SDNode*> {
|
||||
///
|
||||
/// This needs to be a union because the largest node differs on 32 bit systems
|
||||
/// with 4 and 8 byte pointer alignment, respectively.
|
||||
typedef AlignedCharArrayUnion<AtomicSDNode, TargetIndexSDNode,
|
||||
BlockAddressSDNode, GlobalAddressSDNode>
|
||||
LargestSDNode;
|
||||
using LargestSDNode = AlignedCharArrayUnion<AtomicSDNode, TargetIndexSDNode,
|
||||
BlockAddressSDNode,
|
||||
GlobalAddressSDNode>;
|
||||
|
||||
/// The SDNode class with the greatest alignment requirement.
|
||||
typedef GlobalAddressSDNode MostAlignedSDNode;
|
||||
using MostAlignedSDNode = GlobalAddressSDNode;
|
||||
|
||||
namespace ISD {
|
||||
|
||||
|
@ -20,17 +20,26 @@
|
||||
#define LLVM_CODEGEN_SLOTINDEXES_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/ilist.h"
|
||||
#include "llvm/ADT/IntervalMap.h"
|
||||
#include "llvm/ADT/PointerIntPair.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/ilist.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/MachineInstrBundle.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <iterator>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class raw_ostream;
|
||||
|
||||
/// This class represents an entry in the slot index list held in the
|
||||
/// SlotIndexes pass. It should not be used directly. See the
|
||||
/// SlotIndex & SlotIndexes classes for the public interface to this
|
||||
@ -40,7 +49,6 @@ namespace llvm {
|
||||
unsigned index;
|
||||
|
||||
public:
|
||||
|
||||
IndexListEntry(MachineInstr *mi, unsigned index) : mi(mi), index(index) {}
|
||||
|
||||
MachineInstr* getInstr() const { return mi; }
|
||||
@ -301,7 +309,7 @@ namespace llvm {
|
||||
return os;
|
||||
}
|
||||
|
||||
typedef std::pair<SlotIndex, MachineBasicBlock*> IdxMBBPair;
|
||||
using IdxMBBPair = std::pair<SlotIndex, MachineBasicBlock *>;
|
||||
|
||||
inline bool operator<(SlotIndex V, const IdxMBBPair &IM) {
|
||||
return V < IM.first;
|
||||
@ -325,7 +333,7 @@ namespace llvm {
|
||||
// IndexListEntry allocator.
|
||||
BumpPtrAllocator ileAllocator;
|
||||
|
||||
typedef ilist<IndexListEntry> IndexList;
|
||||
using IndexList = ilist<IndexListEntry>;
|
||||
IndexList indexList;
|
||||
|
||||
#ifdef EXPENSIVE_CHECKS
|
||||
@ -334,7 +342,7 @@ namespace llvm {
|
||||
|
||||
MachineFunction *mf;
|
||||
|
||||
typedef DenseMap<const MachineInstr*, SlotIndex> Mi2IndexMap;
|
||||
using Mi2IndexMap = DenseMap<const MachineInstr *, SlotIndex>;
|
||||
Mi2IndexMap mi2iMap;
|
||||
|
||||
/// MBBRanges - Map MBB number to (start, stop) indexes.
|
||||
@ -436,7 +444,7 @@ namespace llvm {
|
||||
const MachineBasicBlock *MBB = MI.getParent();
|
||||
assert(MBB && "MI must be inserted inna basic block");
|
||||
MachineBasicBlock::const_iterator I = MI, B = MBB->begin();
|
||||
for (;;) {
|
||||
while (true) {
|
||||
if (I == B)
|
||||
return getMBBStartIdx(MBB);
|
||||
--I;
|
||||
@ -453,7 +461,7 @@ namespace llvm {
|
||||
const MachineBasicBlock *MBB = MI.getParent();
|
||||
assert(MBB && "MI must be inserted inna basic block");
|
||||
MachineBasicBlock::const_iterator I = MI, E = MBB->end();
|
||||
for (;;) {
|
||||
while (true) {
|
||||
++I;
|
||||
if (I == E)
|
||||
return getMBBEndIdx(MBB);
|
||||
@ -497,21 +505,25 @@ namespace llvm {
|
||||
|
||||
/// Iterator over the idx2MBBMap (sorted pairs of slot index of basic block
|
||||
/// begin and basic block)
|
||||
typedef SmallVectorImpl<IdxMBBPair>::const_iterator MBBIndexIterator;
|
||||
using MBBIndexIterator = SmallVectorImpl<IdxMBBPair>::const_iterator;
|
||||
|
||||
/// Move iterator to the next IdxMBBPair where the SlotIndex is greater or
|
||||
/// equal to \p To.
|
||||
MBBIndexIterator advanceMBBIndex(MBBIndexIterator I, SlotIndex To) const {
|
||||
return std::lower_bound(I, idx2MBBMap.end(), To);
|
||||
}
|
||||
|
||||
/// Get an iterator pointing to the IdxMBBPair with the biggest SlotIndex
|
||||
/// that is greater or equal to \p Idx.
|
||||
MBBIndexIterator findMBBIndex(SlotIndex Idx) const {
|
||||
return advanceMBBIndex(idx2MBBMap.begin(), Idx);
|
||||
}
|
||||
|
||||
/// Returns an iterator for the begin of the idx2MBBMap.
|
||||
MBBIndexIterator MBBIndexBegin() const {
|
||||
return idx2MBBMap.begin();
|
||||
}
|
||||
|
||||
/// Return an iterator for the end of the idx2MBBMap.
|
||||
MBBIndexIterator MBBIndexEnd() const {
|
||||
return idx2MBBMap.end();
|
||||
|
@ -226,7 +226,7 @@ public:
|
||||
// OpTypes are used to encode information about the following logical
|
||||
// operand (which may consist of several MachineOperands) for the
|
||||
// OpParser.
|
||||
typedef enum { DirectMemRefOp, IndirectMemRefOp, ConstantOp } OpType;
|
||||
using OpType = enum { DirectMemRefOp, IndirectMemRefOp, ConstantOp };
|
||||
|
||||
StackMaps(AsmPrinter &AP);
|
||||
|
||||
@ -254,9 +254,10 @@ public:
|
||||
|
||||
private:
|
||||
static const char *WSMP;
|
||||
typedef SmallVector<Location, 8> LocationVec;
|
||||
typedef SmallVector<LiveOutReg, 8> LiveOutVec;
|
||||
typedef MapVector<uint64_t, uint64_t> ConstantPool;
|
||||
|
||||
using LocationVec = SmallVector<Location, 8>;
|
||||
using LiveOutVec = SmallVector<LiveOutReg, 8>;
|
||||
using ConstantPool = MapVector<uint64_t, uint64_t>;
|
||||
|
||||
struct FunctionInfo {
|
||||
uint64_t StackSize = 0;
|
||||
@ -279,8 +280,8 @@ private:
|
||||
LiveOuts(std::move(LiveOuts)) {}
|
||||
};
|
||||
|
||||
typedef MapVector<const MCSymbol *, FunctionInfo> FnInfoMap;
|
||||
typedef std::vector<CallsiteInfo> CallsiteInfoList;
|
||||
using FnInfoMap = MapVector<const MCSymbol *, FunctionInfo>;
|
||||
using CallsiteInfoList = std::vector<CallsiteInfo>;
|
||||
|
||||
AsmPrinter &AP;
|
||||
CallsiteInfoList CSInfos;
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- llvm/CodeGen/WinEHFuncInfo.h ----------------------------*- C++ -*-===//
|
||||
//===- llvm/CodeGen/WinEHFuncInfo.h -----------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -17,28 +17,26 @@
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/TinyPtrVector.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AllocaInst;
|
||||
class BasicBlock;
|
||||
class CatchReturnInst;
|
||||
class Constant;
|
||||
class FuncletPadInst;
|
||||
class Function;
|
||||
class GlobalVariable;
|
||||
class Instruction;
|
||||
class InvokeInst;
|
||||
class IntrinsicInst;
|
||||
class LandingPadInst;
|
||||
class MCExpr;
|
||||
class MCSymbol;
|
||||
class MachineBasicBlock;
|
||||
class Value;
|
||||
class MCSymbol;
|
||||
|
||||
// The following structs respresent the .xdata tables for various
|
||||
// Windows-related EH personalities.
|
||||
|
||||
typedef PointerUnion<const BasicBlock *, MachineBasicBlock *> MBBOrBasicBlock;
|
||||
using MBBOrBasicBlock = PointerUnion<const BasicBlock *, MachineBasicBlock *>;
|
||||
|
||||
struct CxxUnwindMapEntry {
|
||||
int ToState;
|
||||
@ -99,18 +97,18 @@ struct WinEHFuncInfo {
|
||||
SmallVector<WinEHTryBlockMapEntry, 4> TryBlockMap;
|
||||
SmallVector<SEHUnwindMapEntry, 4> SEHUnwindMap;
|
||||
SmallVector<ClrEHUnwindMapEntry, 4> ClrEHUnwindMap;
|
||||
int UnwindHelpFrameIdx = INT_MAX;
|
||||
int PSPSymFrameIdx = INT_MAX;
|
||||
int UnwindHelpFrameIdx = std::numeric_limits<int>::max();
|
||||
int PSPSymFrameIdx = std::numeric_limits<int>::max();
|
||||
|
||||
int getLastStateNumber() const { return CxxUnwindMap.size() - 1; }
|
||||
|
||||
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin,
|
||||
MCSymbol *InvokeEnd);
|
||||
|
||||
int EHRegNodeFrameIndex = INT_MAX;
|
||||
int EHRegNodeEndOffset = INT_MAX;
|
||||
int EHGuardFrameIndex = INT_MAX;
|
||||
int SEHSetFrameOffset = INT_MAX;
|
||||
int EHRegNodeFrameIndex = std::numeric_limits<int>::max();
|
||||
int EHRegNodeEndOffset = std::numeric_limits<int>::max();
|
||||
int EHGuardFrameIndex = std::numeric_limits<int>::max();
|
||||
int SEHSetFrameOffset = std::numeric_limits<int>::max();
|
||||
|
||||
WinEHFuncInfo();
|
||||
};
|
||||
@ -125,5 +123,7 @@ void calculateSEHStateNumbers(const Function *ParentFn,
|
||||
WinEHFuncInfo &FuncInfo);
|
||||
|
||||
void calculateClrEHStateNumbers(const Function *Fn, WinEHFuncInfo &FuncInfo);
|
||||
}
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_CODEGEN_WINEHFUNCINFO_H
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- SelectionDAG.cpp - Implement the SelectionDAG data structures -----===//
|
||||
//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -11,29 +11,46 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "SDNodeDbgValue.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/RuntimeLibcalls.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GlobalAlias.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
@ -41,16 +58,20 @@
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/Mutex.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetIntrinsicInfo.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -269,7 +290,6 @@ ISD::CondCode ISD::getSetCCInverse(ISD::CondCode Op, bool isInteger) {
|
||||
return ISD::CondCode(Operation);
|
||||
}
|
||||
|
||||
|
||||
/// For an integer comparison, return 1 if the comparison is a signed operation
|
||||
/// and 2 if the result is an unsigned comparison. Return zero if the operation
|
||||
/// does not depend on the sign of the input (setne and seteq).
|
||||
@ -338,7 +358,6 @@ ISD::CondCode ISD::getSetCCAndOperation(ISD::CondCode Op1, ISD::CondCode Op2,
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
|
||||
///
|
||||
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
|
||||
ID.AddInteger(OpC);
|
||||
}
|
||||
@ -350,7 +369,6 @@ static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList) {
|
||||
}
|
||||
|
||||
/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
|
||||
///
|
||||
static void AddNodeIDOperands(FoldingSetNodeID &ID,
|
||||
ArrayRef<SDValue> Ops) {
|
||||
for (auto& Op : Ops) {
|
||||
@ -360,7 +378,6 @@ static void AddNodeIDOperands(FoldingSetNodeID &ID,
|
||||
}
|
||||
|
||||
/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
|
||||
///
|
||||
static void AddNodeIDOperands(FoldingSetNodeID &ID,
|
||||
ArrayRef<SDUse> Ops) {
|
||||
for (auto& Op : Ops) {
|
||||
@ -392,10 +409,9 @@ static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
|
||||
break;
|
||||
}
|
||||
case ISD::TargetConstantFP:
|
||||
case ISD::ConstantFP: {
|
||||
case ISD::ConstantFP:
|
||||
ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
|
||||
break;
|
||||
}
|
||||
case ISD::TargetGlobalAddress:
|
||||
case ISD::GlobalAddress:
|
||||
case ISD::TargetGlobalTLSAddress:
|
||||
@ -770,7 +786,6 @@ bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
|
||||
/// maps and modified in place. Add it back to the CSE maps, unless an identical
|
||||
/// node already exists, in which case transfer all its users to the existing
|
||||
/// node. This transfer can potentially trigger recursive merging.
|
||||
///
|
||||
void
|
||||
SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
|
||||
// For node types that aren't CSE'd, just act as if no identical node
|
||||
@ -835,7 +850,6 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
|
||||
return Node;
|
||||
}
|
||||
|
||||
|
||||
/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
|
||||
/// were replaced with those specified. If this node is never memoized,
|
||||
/// return null, otherwise return a pointer to the slot it would take. If a
|
||||
@ -864,10 +878,9 @@ unsigned SelectionDAG::getEVTAlignment(EVT VT) const {
|
||||
|
||||
// EntryNode could meaningfully have debug info if we can find it...
|
||||
SelectionDAG::SelectionDAG(const TargetMachine &tm, CodeGenOpt::Level OL)
|
||||
: TM(tm), TSI(nullptr), TLI(nullptr), OptLevel(OL),
|
||||
: TM(tm), OptLevel(OL),
|
||||
EntryNode(ISD::EntryToken, 0, DebugLoc(), getVTList(MVT::Other)),
|
||||
Root(getEntryNode()), NewNodesMustHaveLegalTypes(false),
|
||||
UpdateListeners(nullptr) {
|
||||
Root(getEntryNode()) {
|
||||
InsertNode(&EntryNode);
|
||||
DbgInfo = new SDDbgInfo();
|
||||
}
|
||||
@ -1038,7 +1051,6 @@ SDValue SelectionDAG::getZeroExtendVectorInReg(SDValue Op, const SDLoc &DL,
|
||||
}
|
||||
|
||||
/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
|
||||
///
|
||||
SDValue SelectionDAG::getNOT(const SDLoc &DL, SDValue Val, EVT VT) {
|
||||
EVT EltVT = VT.getScalarType();
|
||||
SDValue NegOne =
|
||||
@ -1317,7 +1329,6 @@ SDValue SelectionDAG::getConstantPool(const Constant *C, EVT VT,
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
|
||||
SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,
|
||||
unsigned Alignment, int Offset,
|
||||
bool isTarget,
|
||||
@ -1451,7 +1462,7 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1,
|
||||
// Validate that all indices in Mask are within the range of the elements
|
||||
// input to the shuffle.
|
||||
int NElts = Mask.size();
|
||||
assert(all_of(Mask, [&](int M) { return M < (NElts * 2); }) &&
|
||||
assert(llvm::all_of(Mask, [&](int M) { return M < (NElts * 2); }) &&
|
||||
"Index out of range");
|
||||
|
||||
// Copy the mask so we can do any needed cleanup.
|
||||
@ -2918,7 +2929,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
||||
else
|
||||
DemandedRHS.setBit((unsigned)M % NumElts);
|
||||
}
|
||||
Tmp = UINT_MAX;
|
||||
Tmp = std::numeric_limits<unsigned>::max();
|
||||
if (!!DemandedLHS)
|
||||
Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
|
||||
if (!!DemandedRHS) {
|
||||
@ -3122,7 +3133,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
||||
unsigned EltIdx = CEltNo->getZExtValue();
|
||||
|
||||
// If we demand the inserted element then get its sign bits.
|
||||
Tmp = UINT_MAX;
|
||||
Tmp = std::numeric_limits<unsigned>::max();
|
||||
if (DemandedElts[EltIdx]) {
|
||||
// TODO - handle implicit truncation of inserted elements.
|
||||
if (InVal.getScalarValueSizeInBits() != VTBits)
|
||||
@ -3188,7 +3199,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
||||
case ISD::CONCAT_VECTORS:
|
||||
// Determine the minimum number of sign bits across all demanded
|
||||
// elts of the input vectors. Early out if the result is already 1.
|
||||
Tmp = UINT_MAX;
|
||||
Tmp = std::numeric_limits<unsigned>::max();
|
||||
EVT SubVectorVT = Op.getOperand(0).getValueType();
|
||||
unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
|
||||
unsigned NumSubVectors = Op.getNumOperands();
|
||||
@ -3327,7 +3338,7 @@ bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
|
||||
|
||||
static SDValue FoldCONCAT_VECTORS(const SDLoc &DL, EVT VT,
|
||||
ArrayRef<SDValue> Ops,
|
||||
llvm::SelectionDAG &DAG) {
|
||||
SelectionDAG &DAG) {
|
||||
assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
|
||||
assert(llvm::all_of(Ops,
|
||||
[Ops](SDValue Op) {
|
||||
@ -3836,8 +3847,9 @@ bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
|
||||
return true;
|
||||
|
||||
return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
|
||||
any_of(Divisor->op_values(),
|
||||
[](SDValue V) { return V.isUndef() || isNullConstant(V); });
|
||||
llvm::any_of(Divisor->op_values(),
|
||||
[](SDValue V) { return V.isUndef() ||
|
||||
isNullConstant(V); });
|
||||
// TODO: Handle signed overflow.
|
||||
}
|
||||
// TODO: Handle oversized shifts.
|
||||
@ -3948,8 +3960,8 @@ SDValue SelectionDAG::FoldConstantVectorArithmetic(unsigned Opcode,
|
||||
// All operands must be vector types with the same number of elements as
|
||||
// the result type and must be either UNDEF or a build vector of constant
|
||||
// or UNDEF scalars.
|
||||
if (!all_of(Ops, IsConstantBuildVectorOrUndef) ||
|
||||
!all_of(Ops, IsScalarOrSameVectorSize))
|
||||
if (!llvm::all_of(Ops, IsConstantBuildVectorOrUndef) ||
|
||||
!llvm::all_of(Ops, IsScalarOrSameVectorSize))
|
||||
return SDValue();
|
||||
|
||||
// If we are comparing vectors, then the result needs to be a i1 boolean
|
||||
@ -5550,7 +5562,7 @@ SDValue SelectionDAG::getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl,
|
||||
Opcode == ISD::PREFETCH ||
|
||||
Opcode == ISD::LIFETIME_START ||
|
||||
Opcode == ISD::LIFETIME_END ||
|
||||
(Opcode <= INT_MAX &&
|
||||
(Opcode <= std::numeric_limits<int>::max() &&
|
||||
(int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
|
||||
"Opcode is not a memory-accessing opcode!");
|
||||
|
||||
@ -5884,7 +5896,6 @@ SDValue SelectionDAG::getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain,
|
||||
SDValue Ptr, SDValue Mask, SDValue Src0,
|
||||
EVT MemVT, MachineMemOperand *MMO,
|
||||
ISD::LoadExtType ExtTy, bool isExpanding) {
|
||||
|
||||
SDVTList VTs = getVTList(VT, MVT::Other);
|
||||
SDValue Ops[] = { Chain, Ptr, Mask, Src0 };
|
||||
FoldingSetNodeID ID;
|
||||
@ -6038,13 +6049,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
|
||||
switch (Opcode) {
|
||||
default: break;
|
||||
case ISD::CONCAT_VECTORS: {
|
||||
case ISD::CONCAT_VECTORS:
|
||||
// Attempt to fold CONCAT_VECTORS into BUILD_VECTOR or UNDEF.
|
||||
if (SDValue V = FoldCONCAT_VECTORS(DL, VT, Ops, *this))
|
||||
return V;
|
||||
break;
|
||||
}
|
||||
case ISD::SELECT_CC: {
|
||||
case ISD::SELECT_CC:
|
||||
assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
|
||||
assert(Ops[0].getValueType() == Ops[1].getValueType() &&
|
||||
"LHS and RHS of condition must have same type!");
|
||||
@ -6053,14 +6063,12 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
assert(Ops[2].getValueType() == VT &&
|
||||
"select_cc node must be of same type as true and false value!");
|
||||
break;
|
||||
}
|
||||
case ISD::BR_CC: {
|
||||
case ISD::BR_CC:
|
||||
assert(NumOps == 5 && "BR_CC takes 5 operands!");
|
||||
assert(Ops[2].getValueType() == Ops[3].getValueType() &&
|
||||
"LHS/RHS of comparison should match types!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Memoize nodes.
|
||||
SDNode *N;
|
||||
@ -6599,7 +6607,6 @@ SDNode* SelectionDAG::mutateStrictFPToFP(SDNode *Node) {
|
||||
return Res;
|
||||
}
|
||||
|
||||
|
||||
/// getMachineNode - These are used for target selectors to create a new node
|
||||
/// with specified return type(s), MachineInstr opcode, and operands.
|
||||
///
|
||||
@ -6812,7 +6819,7 @@ public:
|
||||
: SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
|
||||
};
|
||||
|
||||
}
|
||||
} // end anonymous namespace
|
||||
|
||||
/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
|
||||
/// This can cause recursive merging of nodes in the DAG.
|
||||
@ -6858,7 +6865,6 @@ void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) {
|
||||
AddModifiedNodeToCSEMaps(User);
|
||||
}
|
||||
|
||||
|
||||
// If we just RAUW'd the root, take note.
|
||||
if (FromN == getRoot())
|
||||
setRoot(To);
|
||||
@ -7028,6 +7034,7 @@ void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
|
||||
/// to record information about a use.
|
||||
struct UseMemo {
|
||||
@ -7040,7 +7047,8 @@ namespace {
|
||||
bool operator<(const UseMemo &L, const UseMemo &R) {
|
||||
return (intptr_t)L.User < (intptr_t)R.User;
|
||||
}
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
|
||||
/// uses of other values produced by From.getNode() alone. The same value
|
||||
@ -7106,7 +7114,6 @@ void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From,
|
||||
/// based on their topological order. It returns the maximum id and a vector
|
||||
/// of the SDNodes* in assigned order by reference.
|
||||
unsigned SelectionDAG::AssignTopologicalOrder() {
|
||||
|
||||
unsigned DAGSize = 0;
|
||||
|
||||
// SortedPos tracks the progress of the algorithm. Nodes before it are
|
||||
@ -7333,6 +7340,7 @@ void SDNode::Profile(FoldingSetNodeID &ID) const {
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
struct EVTArray {
|
||||
std::vector<EVT> VTs;
|
||||
|
||||
@ -7342,11 +7350,12 @@ namespace {
|
||||
VTs.push_back(MVT((MVT::SimpleValueType)i));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs;
|
||||
} // end anonymous namespace
|
||||
|
||||
static ManagedStatic<std::set<EVT, EVT::compareRawBits>> EVTs;
|
||||
static ManagedStatic<EVTArray> SimpleVTArray;
|
||||
static ManagedStatic<sys::SmartMutex<true> > VTMutex;
|
||||
static ManagedStatic<sys::SmartMutex<true>> VTMutex;
|
||||
|
||||
/// getValueTypeList - Return a pointer to the specified value type.
|
||||
///
|
||||
@ -7380,7 +7389,6 @@ bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
|
||||
return NUses == 0;
|
||||
}
|
||||
|
||||
|
||||
/// hasAnyUseOfValue - Return true if there are any use of the indicated
|
||||
/// value. This method ignores uses of other values defined by this operation.
|
||||
bool SDNode::hasAnyUseOfValue(unsigned Value) const {
|
||||
@ -7393,9 +7401,7 @@ bool SDNode::hasAnyUseOfValue(unsigned Value) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// isOnlyUserOf - Return true if this node is the only use of N.
|
||||
///
|
||||
bool SDNode::isOnlyUserOf(const SDNode *N) const {
|
||||
bool Seen = false;
|
||||
for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) {
|
||||
@ -7425,7 +7431,6 @@ bool SDNode::areOnlyUsersOf(ArrayRef<const SDNode *> Nodes, const SDNode *N) {
|
||||
}
|
||||
|
||||
/// isOperand - Return true if this node is an operand of N.
|
||||
///
|
||||
bool SDValue::isOperandOf(const SDNode *N) const {
|
||||
for (const SDValue &Op : N->op_values())
|
||||
if (*this == Op)
|
||||
@ -7475,7 +7480,7 @@ bool SDValue::reachesChainWithoutSideEffects(SDValue Dest,
|
||||
}
|
||||
// Next, try a deep search: check whether every operand of the TokenFactor
|
||||
// reaches Dest.
|
||||
return all_of((*this)->ops(), [=](SDValue Op) {
|
||||
return llvm::all_of((*this)->ops(), [=](SDValue Op) {
|
||||
return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
|
||||
});
|
||||
}
|
||||
@ -7627,7 +7632,6 @@ bool SelectionDAG::areNonVolatileConsecutiveLoads(LoadSDNode *LD,
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if
|
||||
/// it cannot be inferred.
|
||||
unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const {
|
||||
@ -7718,7 +7722,6 @@ unsigned GlobalAddressSDNode::getAddressSpace() const {
|
||||
return getGlobal()->getType()->getAddressSpace();
|
||||
}
|
||||
|
||||
|
||||
Type *ConstantPoolSDNode::getType() const {
|
||||
if (isMachineConstantPoolEntry())
|
||||
return Val.MachineCPVal->getType();
|
||||
|
Loading…
Reference in New Issue
Block a user