Remove the explicit SDNodeIterator::operator= in favor of the implicit default

There doesn't seem to be any need to assert that iterator assignment is
between iterators over the same node - if you want to reuse an iterator
variable to iterate another node, that's perfectly acceptable. Just
don't mix comparisons between iterators into disjoint sequences, as
usual.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231135 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2015-03-03 21:17:08 +00:00
parent 113c43b2c6
commit b13215ec3b
23 changed files with 91 additions and 60 deletions

View File

@ -104,6 +104,12 @@ class CallGraph {
public: public:
CallGraph(Module &M); CallGraph(Module &M);
// Copyable for syntax's sake, but rely on RVO such that this is never called.
// Should really make this type legitimately movable instead, possibly my
// making FunctionMap values and the CallsExternalCode member unique_ptrs,
// then adding some internal helper objects that can call
// "allReferencesDropped" on those elements before their final destruction.
CallGraph(const CallGraph&);
~CallGraph(); ~CallGraph();
void print(raw_ostream &OS) const; void print(raw_ostream &OS) const;

View File

@ -104,6 +104,8 @@ public:
llvm_unreachable("ProcessInterval should never fail for first interval!"); llvm_unreachable("ProcessInterval should never fail for first interval!");
} }
} }
// Declare but don't define, rely on RVO to optimize this away.
IntervalIterator(const IntervalIterator&);
IntervalIterator(IntervalPartition &IP, bool OwnMemory) : IOwnMem(OwnMemory) { IntervalIterator(IntervalPartition &IP, bool OwnMemory) : IOwnMem(OwnMemory) {
OrigContainer = &IP; OrigContainer = &IP;

View File

@ -146,6 +146,8 @@ public:
return tmp; return tmp;
} }
RNSuccIterator(const RNSuccIterator&) = default;
inline const Self &operator=(const Self &I) { inline const Self &operator=(const Self &I) {
if (this != &I) { if (this != &I) {
assert(getNode()->getParent() == I.getNode()->getParent() assert(getNode()->getParent() == I.getNode()->getParent()
@ -241,6 +243,8 @@ public:
return tmp; return tmp;
} }
RNSuccIterator(const RNSuccIterator&) = default;
inline const Self &operator=(const Self &I) { inline const Self &operator=(const Self &I) {
if (this != &I) { if (this != &I) {
assert(Node->getParent() == I.Node->getParent() assert(Node->getParent() == I.Node->getParent()

View File

@ -199,7 +199,7 @@ namespace llvm {
// of live ranges of physical registers in computeRegUnitRange. // of live ranges of physical registers in computeRegUnitRange.
// After that the set is flushed to the segment vector and deleted. // After that the set is flushed to the segment vector and deleted.
typedef std::set<Segment> SegmentSet; typedef std::set<Segment> SegmentSet;
SegmentSet *segmentSet; std::unique_ptr<SegmentSet> segmentSet;
typedef Segments::iterator iterator; typedef Segments::iterator iterator;
iterator begin() { return segments.begin(); } iterator begin() { return segments.begin(); }
@ -218,15 +218,13 @@ namespace llvm {
const_vni_iterator vni_end() const { return valnos.end(); } const_vni_iterator vni_end() const { return valnos.end(); }
/// Constructs a new LiveRange object. /// Constructs a new LiveRange object.
LiveRange(bool UseSegmentSet = false) : segmentSet(nullptr) { LiveRange(bool UseSegmentSet = false)
if (UseSegmentSet) : segmentSet(UseSegmentSet ? llvm::make_unique<SegmentSet>()
segmentSet = new SegmentSet(); : nullptr) {}
}
/// Constructs a new LiveRange object by copying segments and valnos from /// Constructs a new LiveRange object by copying segments and valnos from
/// another LiveRange. /// another LiveRange.
LiveRange(const LiveRange &Other, BumpPtrAllocator &Allocator) LiveRange(const LiveRange &Other, BumpPtrAllocator &Allocator) {
: segmentSet(nullptr) {
assert(Other.segmentSet == nullptr && assert(Other.segmentSet == nullptr &&
"Copying of LiveRanges with active SegmentSets is not supported"); "Copying of LiveRanges with active SegmentSets is not supported");
@ -240,8 +238,6 @@ namespace llvm {
} }
} }
~LiveRange() { delete segmentSet; }
/// advanceTo - Advance the specified iterator to point to the Segment /// advanceTo - Advance the specified iterator to point to the Segment
/// containing the specified position, or end() if the position is past the /// containing the specified position, or end() if the position is past the
/// end of the range. If no Segment contains this position, but the /// end of the range. If no Segment contains this position, but the
@ -745,8 +741,6 @@ namespace llvm {
#endif #endif
private: private:
LiveInterval& operator=(const LiveInterval& rhs) = delete;
/// Appends @p Range to SubRanges list. /// Appends @p Range to SubRanges list.
void appendSubRange(SubRange *Range) { void appendSubRange(SubRange *Range) {
Range->Next = SubRanges; Range->Next = SubRanges;

View File

@ -2063,12 +2063,6 @@ public:
} }
bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
const SDNodeIterator &operator=(const SDNodeIterator &I) {
assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
Operand = I.Operand;
return *this;
}
pointer operator*() const { pointer operator*() const {
return Node->getOperand(Operand).getNode(); return Node->getOperand(Operand).getNode();
} }

View File

@ -132,11 +132,13 @@ private:
/// \brief Proxy object to allow write access in operator[] /// \brief Proxy object to allow write access in operator[]
class SuccessorProxy { class SuccessorProxy {
Self it; Self it;
friend class SuccIterator;
SuccessorProxy(const SuccessorProxy&) = default;
public: public:
explicit SuccessorProxy(const Self &it) : it(it) {} explicit SuccessorProxy(const Self &it) : it(it) {}
SuccessorProxy &operator=(SuccessorProxy r) { SuccessorProxy &operator=(const SuccessorProxy &r) {
*this = reference(r); *this = reference(r);
return *this; return *this;
} }
@ -165,6 +167,8 @@ public:
idx = 0; idx = 0;
} }
SuccIterator(const SuccIterator&) = default;
inline const Self &operator=(const Self &I) { inline const Self &operator=(const Self &I) {
assert(Term == I.Term &&"Cannot assign iterators to two different blocks!"); assert(Term == I.Term &&"Cannot assign iterators to two different blocks!");
idx = I.idx; idx = I.idx;

View File

@ -51,6 +51,7 @@ protected:
Tracking, Tracking,
Weak Weak
}; };
ValueHandleBase(const ValueHandleBase&) = default;
private: private:
PointerIntPair<ValueHandleBase**, 2, HandleBaseKind> PrevPair; PointerIntPair<ValueHandleBase**, 2, HandleBaseKind> PrevPair;
@ -58,7 +59,6 @@ private:
Value* V; Value* V;
ValueHandleBase(const ValueHandleBase&) = delete;
public: public:
explicit ValueHandleBase(HandleBaseKind Kind) explicit ValueHandleBase(HandleBaseKind Kind)
: PrevPair(nullptr, Kind), Next(nullptr), V(nullptr) {} : PrevPair(nullptr, Kind), Next(nullptr), V(nullptr) {}
@ -144,6 +144,10 @@ public:
WeakVH(Value *P) : ValueHandleBase(Weak, P) {} WeakVH(Value *P) : ValueHandleBase(Weak, P) {}
WeakVH(const WeakVH &RHS) WeakVH(const WeakVH &RHS)
: ValueHandleBase(Weak, RHS) {} : ValueHandleBase(Weak, RHS) {}
// Questionable - these are stored in a vector in AssumptionCache (perhaps
// other copies too) and need to be copied. When copied, how would they
// properly insert into the use list?
WeakVH&operator=(const WeakVH &RHS) = default;
Value *operator=(Value *RHS) { Value *operator=(Value *RHS) {
return ValueHandleBase::operator=(RHS); return ValueHandleBase::operator=(RHS);
@ -345,7 +349,8 @@ protected:
CallbackVH(const CallbackVH &RHS) CallbackVH(const CallbackVH &RHS)
: ValueHandleBase(Callback, RHS) {} : ValueHandleBase(Callback, RHS) {}
virtual ~CallbackVH() {} virtual ~CallbackVH() = default;
CallbackVH &operator=(const CallbackVH &) = default;
void setValPtr(Value *P) { void setValPtr(Value *P) {
ValueHandleBase::operator=(P); ValueHandleBase::operator=(P);

View File

@ -477,7 +477,7 @@ namespace llvm {
/// allocator supports it). /// allocator supports it).
/// @return The allocated memory. Could be NULL. /// @return The allocated memory. Could be NULL.
inline void *operator new(size_t Bytes, llvm::MCContext &C, inline void *operator new(size_t Bytes, llvm::MCContext &C,
size_t Alignment = 16) throw () { size_t Alignment = 16) LLVM_NOEXCEPT {
return C.Allocate(Bytes, Alignment); return C.Allocate(Bytes, Alignment);
} }
/// @brief Placement delete companion to the new above. /// @brief Placement delete companion to the new above.
@ -487,7 +487,7 @@ inline void *operator new(size_t Bytes, llvm::MCContext &C,
/// is called implicitly by the compiler if a placement new expression using /// is called implicitly by the compiler if a placement new expression using
/// the MCContext throws in the object constructor. /// the MCContext throws in the object constructor.
inline void operator delete(void *Ptr, llvm::MCContext &C, size_t) inline void operator delete(void *Ptr, llvm::MCContext &C, size_t)
throw () { LLVM_NOEXCEPT {
C.Deallocate(Ptr); C.Deallocate(Ptr);
} }
@ -511,7 +511,7 @@ inline void operator delete(void *Ptr, llvm::MCContext &C, size_t)
/// allocator supports it). /// allocator supports it).
/// @return The allocated memory. Could be NULL. /// @return The allocated memory. Could be NULL.
inline void *operator new[](size_t Bytes, llvm::MCContext& C, inline void *operator new[](size_t Bytes, llvm::MCContext& C,
size_t Alignment = 16) throw () { size_t Alignment = 16) LLVM_NOEXCEPT {
return C.Allocate(Bytes, Alignment); return C.Allocate(Bytes, Alignment);
} }
@ -521,7 +521,7 @@ inline void *operator new[](size_t Bytes, llvm::MCContext& C,
/// invoking it directly; see the new[] operator for more details. This operator /// invoking it directly; see the new[] operator for more details. This operator
/// is called implicitly by the compiler if a placement new[] expression using /// is called implicitly by the compiler if a placement new[] expression using
/// the MCContext throws in the object constructor. /// the MCContext throws in the object constructor.
inline void operator delete[](void *Ptr, llvm::MCContext &C) throw () { inline void operator delete[](void *Ptr, llvm::MCContext &C) LLVM_NOEXCEPT {
C.Deallocate(Ptr); C.Deallocate(Ptr);
} }

View File

@ -352,9 +352,13 @@ struct cat {
// Support value comparison outside the template. // Support value comparison outside the template.
struct GenericOptionValue { struct GenericOptionValue {
virtual ~GenericOptionValue() {} virtual ~GenericOptionValue() = default;
virtual bool compare(const GenericOptionValue &V) const = 0; virtual bool compare(const GenericOptionValue &V) const = 0;
protected:
GenericOptionValue() = default;
GenericOptionValue(const GenericOptionValue&) = default;
GenericOptionValue &operator=(const GenericOptionValue &) = default;
private: private:
virtual void anchor(); virtual void anchor();
}; };
@ -386,6 +390,9 @@ struct OptionValueBase : public GenericOptionValue {
template <class DataType> class OptionValueCopy : public GenericOptionValue { template <class DataType> class OptionValueCopy : public GenericOptionValue {
DataType Value; DataType Value;
bool Valid; bool Valid;
protected:
OptionValueCopy(const OptionValueCopy&) = default;
OptionValueCopy &operator=(const OptionValueCopy&) = default;
public: public:
OptionValueCopy() : Valid(false) {} OptionValueCopy() : Valid(false) {}
@ -417,6 +424,10 @@ public:
template <class DataType> template <class DataType>
struct OptionValueBase<DataType, false> : OptionValueCopy<DataType> { struct OptionValueBase<DataType, false> : OptionValueCopy<DataType> {
typedef DataType WrapperType; typedef DataType WrapperType;
protected:
OptionValueBase() = default;
OptionValueBase(const OptionValueBase&) = default;
OptionValueBase &operator=(const OptionValueBase&) = default;
}; };
// Top-level option class. // Top-level option class.
@ -721,6 +732,8 @@ public:
virtual void anchor(); virtual void anchor();
protected: protected:
basic_parser_impl(const basic_parser_impl&) = default;
// A helper for basic_parser::printOptionDiff. // A helper for basic_parser::printOptionDiff.
void printOptionName(const Option &O, size_t GlobalWidth) const; void printOptionName(const Option &O, size_t GlobalWidth) const;
}; };
@ -729,6 +742,9 @@ protected:
// a typedef for the provided data type. // a typedef for the provided data type.
// //
template <class DataType> class basic_parser : public basic_parser_impl { template <class DataType> class basic_parser : public basic_parser_impl {
protected:
// Workaround PR22763
basic_parser(const basic_parser& RHS) : basic_parser_impl(RHS) {}
public: public:
basic_parser(Option &O) : basic_parser_impl(O) {} basic_parser(Option &O) : basic_parser_impl(O) {}
typedef DataType parser_data_type; typedef DataType parser_data_type;
@ -738,7 +754,7 @@ public:
//-------------------------------------------------- //--------------------------------------------------
// parser<bool> // parser<bool>
// //
template <> class parser<bool> : public basic_parser<bool> { template <> class parser<bool> final : public basic_parser<bool> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -765,7 +781,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>);
//-------------------------------------------------- //--------------------------------------------------
// parser<boolOrDefault> // parser<boolOrDefault>
template <> class parser<boolOrDefault> : public basic_parser<boolOrDefault> { template <> class parser<boolOrDefault> final : public basic_parser<boolOrDefault> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -791,7 +807,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
//-------------------------------------------------- //--------------------------------------------------
// parser<int> // parser<int>
// //
template <> class parser<int> : public basic_parser<int> { template <> class parser<int> final : public basic_parser<int> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -813,7 +829,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<int>);
//-------------------------------------------------- //--------------------------------------------------
// parser<unsigned> // parser<unsigned>
// //
template <> class parser<unsigned> : public basic_parser<unsigned> { template <> class parser<unsigned> final : public basic_parser<unsigned> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -836,7 +852,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned>);
// parser<unsigned long long> // parser<unsigned long long>
// //
template <> template <>
class parser<unsigned long long> : public basic_parser<unsigned long long> { class parser<unsigned long long> final : public basic_parser<unsigned long long> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -859,7 +875,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned long long>);
//-------------------------------------------------- //--------------------------------------------------
// parser<double> // parser<double>
// //
template <> class parser<double> : public basic_parser<double> { template <> class parser<double> final : public basic_parser<double> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -881,7 +897,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<double>);
//-------------------------------------------------- //--------------------------------------------------
// parser<float> // parser<float>
// //
template <> class parser<float> : public basic_parser<float> { template <> class parser<float> final : public basic_parser<float> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -903,7 +919,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<float>);
//-------------------------------------------------- //--------------------------------------------------
// parser<std::string> // parser<std::string>
// //
template <> class parser<std::string> : public basic_parser<std::string> { template <> class parser<std::string> final : public basic_parser<std::string> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}
@ -928,7 +944,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<std::string>);
//-------------------------------------------------- //--------------------------------------------------
// parser<char> // parser<char>
// //
template <> class parser<char> : public basic_parser<char> { template <> class parser<char> final : public basic_parser<char> {
public: public:
parser(Option &O) : basic_parser(O) {} parser(Option &O) : basic_parser(O) {}

View File

@ -38,6 +38,7 @@ class format_object_base {
protected: protected:
const char *Fmt; const char *Fmt;
~format_object_base() {} // Disallow polymorphic deletion. ~format_object_base() {} // Disallow polymorphic deletion.
format_object_base(const format_object_base&) = default;
virtual void home(); // Out of line virtual method. virtual void home(); // Out of line virtual method.
/// Call snprintf() for this object, on the given buffer and size. /// Call snprintf() for this object, on the given buffer and size.

View File

@ -145,11 +145,11 @@ public:
unsigned int getType() const { return TypeID; } unsigned int getType() const { return TypeID; }
void *operator new(size_t Size, BumpPtrAllocator &Alloc, void *operator new(size_t Size, BumpPtrAllocator &Alloc,
size_t Alignment = 16) throw() { size_t Alignment = 16) LLVM_NOEXCEPT {
return Alloc.Allocate(Size, Alignment); return Alloc.Allocate(Size, Alignment);
} }
void operator delete(void *Ptr, BumpPtrAllocator &Alloc, size_t Size) throw() { void operator delete(void *Ptr, BumpPtrAllocator &Alloc, size_t Size) LLVM_NOEXCEPT {
Alloc.Deallocate(Ptr, Size); Alloc.Deallocate(Ptr, Size);
} }
@ -157,7 +157,7 @@ protected:
std::unique_ptr<Document> &Doc; std::unique_ptr<Document> &Doc;
SMRange SourceRange; SMRange SourceRange;
void operator delete(void *) throw() {} void operator delete(void *) LLVM_NOEXCEPT {}
virtual ~Node() {} virtual ~Node() {}

View File

@ -151,15 +151,13 @@ struct FunctionInfo {
struct CFLAliasAnalysis; struct CFLAliasAnalysis;
struct FunctionHandle : public CallbackVH { struct FunctionHandle final : public CallbackVH {
FunctionHandle(Function *Fn, CFLAliasAnalysis *CFLAA) FunctionHandle(Function *Fn, CFLAliasAnalysis *CFLAA)
: CallbackVH(Fn), CFLAA(CFLAA) { : CallbackVH(Fn), CFLAA(CFLAA) {
assert(Fn != nullptr); assert(Fn != nullptr);
assert(CFLAA != nullptr); assert(CFLAA != nullptr);
} }
virtual ~FunctionHandle() {}
void deleted() override { removeSelfFromCache(); } void deleted() override { removeSelfFromCache(); }
void allUsesReplacedWith(Value *) override { removeSelfFromCache(); } void allUsesReplacedWith(Value *) override { removeSelfFromCache(); }

View File

@ -2365,9 +2365,9 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
ParseToken(lltok::rbrace, "expected end of struct constant")) ParseToken(lltok::rbrace, "expected end of struct constant"))
return true; return true;
ID.ConstantStructElts = new Constant*[Elts.size()]; ID.ConstantStructElts.reset(new Constant*[Elts.size()]);
ID.UIntVal = Elts.size(); ID.UIntVal = Elts.size();
memcpy(ID.ConstantStructElts, Elts.data(), Elts.size()*sizeof(Elts[0])); memcpy(ID.ConstantStructElts.get(), Elts.data(), Elts.size()*sizeof(Elts[0]));
ID.Kind = ValID::t_ConstantStruct; ID.Kind = ValID::t_ConstantStruct;
return false; return false;
} }
@ -2386,8 +2386,8 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
return true; return true;
if (isPackedStruct) { if (isPackedStruct) {
ID.ConstantStructElts = new Constant*[Elts.size()]; ID.ConstantStructElts.reset(new Constant*[Elts.size()]);
memcpy(ID.ConstantStructElts, Elts.data(), Elts.size()*sizeof(Elts[0])); memcpy(ID.ConstantStructElts.get(), Elts.data(), Elts.size()*sizeof(Elts[0]));
ID.UIntVal = Elts.size(); ID.UIntVal = Elts.size();
ID.Kind = ValID::t_PackedConstantStruct; ID.Kind = ValID::t_PackedConstantStruct;
return false; return false;
@ -2512,7 +2512,12 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (!F) { if (!F) {
// Make a global variable as a placeholder for this reference. // Make a global variable as a placeholder for this reference.
GlobalValue *&FwdRef = ForwardRefBlockAddresses[Fn][Label]; GlobalValue *&FwdRef =
ForwardRefBlockAddresses.insert(std::make_pair(
std::move(Fn),
std::map<ValID, GlobalValue *>()))
.first->second.insert(std::make_pair(std::move(Label), nullptr))
.first->second;
if (!FwdRef) if (!FwdRef)
FwdRef = new GlobalVariable(*M, Type::getInt8Ty(Context), false, FwdRef = new GlobalVariable(*M, Type::getInt8Ty(Context), false,
GlobalValue::InternalLinkage, nullptr, ""); GlobalValue::InternalLinkage, nullptr, "");
@ -3942,8 +3947,8 @@ bool LLParser::ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V,
return Error(ID.Loc, "element " + Twine(i) + return Error(ID.Loc, "element " + Twine(i) +
" of struct initializer doesn't match struct element type"); " of struct initializer doesn't match struct element type");
V = ConstantStruct::get(ST, makeArrayRef(ID.ConstantStructElts, V = ConstantStruct::get(
ID.UIntVal)); ST, makeArrayRef(ID.ConstantStructElts.get(), ID.UIntVal));
} else } else
return Error(ID.Loc, "constant expression type mismatch"); return Error(ID.Loc, "constant expression type mismatch");
return false; return false;

View File

@ -62,13 +62,9 @@ namespace llvm {
APSInt APSIntVal; APSInt APSIntVal;
APFloat APFloatVal; APFloat APFloatVal;
Constant *ConstantVal; Constant *ConstantVal;
Constant **ConstantStructElts; std::unique_ptr<Constant*[]> ConstantStructElts;
ValID() : Kind(t_LocalID), APFloatVal(0.0) {} ValID() : Kind(t_LocalID), APFloatVal(0.0) {}
~ValID() {
if (Kind == t_ConstantStruct || Kind == t_PackedConstantStruct)
delete [] ConstantStructElts;
}
bool operator<(const ValID &RHS) const { bool operator<(const ValID &RHS) const {
if (Kind == t_LocalID || Kind == t_GlobalID) if (Kind == t_LocalID || Kind == t_GlobalID)

View File

@ -743,7 +743,6 @@ void LiveRange::flushSegmentSet() {
segments.empty() && segments.empty() &&
"segment set can be used only initially before switching to the array"); "segment set can be used only initially before switching to the array");
segments.append(segmentSet->begin(), segmentSet->end()); segments.append(segmentSet->begin(), segmentSet->end());
delete segmentSet;
segmentSet = nullptr; segmentSet = nullptr;
verify(); verify();
} }

View File

@ -61,8 +61,10 @@ LiveStacks::getOrCreateInterval(int Slot, const TargetRegisterClass *RC) {
assert(Slot >= 0 && "Spill slot indice must be >= 0"); assert(Slot >= 0 && "Spill slot indice must be >= 0");
SS2IntervalMap::iterator I = S2IMap.find(Slot); SS2IntervalMap::iterator I = S2IMap.find(Slot);
if (I == S2IMap.end()) { if (I == S2IMap.end()) {
I = S2IMap.insert(I, std::make_pair(Slot, I = S2IMap.emplace(std::piecewise_construct, std::forward_as_tuple(Slot),
LiveInterval(TargetRegisterInfo::index2StackSlot(Slot), 0.0F))); std::forward_as_tuple(
TargetRegisterInfo::index2StackSlot(Slot), 0.0F))
.first;
S2RCMap.insert(std::make_pair(Slot, RC)); S2RCMap.insert(std::make_pair(Slot, RC));
} else { } else {
// Use the largest common subclass register class. // Use the largest common subclass register class.

View File

@ -9115,9 +9115,6 @@ struct LoadedSlice {
unsigned Shift = 0, SelectionDAG *DAG = nullptr) unsigned Shift = 0, SelectionDAG *DAG = nullptr)
: Inst(Inst), Origin(Origin), Shift(Shift), DAG(DAG) {} : Inst(Inst), Origin(Origin), Shift(Shift), DAG(DAG) {}
LoadedSlice(const LoadedSlice &LS)
: Inst(LS.Inst), Origin(LS.Origin), Shift(LS.Shift), DAG(LS.DAG) {}
/// \brief Get the bits used in a chunk of bits \p BitWidth large. /// \brief Get the bits used in a chunk of bits \p BitWidth large.
/// \return Result is \p BitWidth and has used bits set to 1 and /// \return Result is \p BitWidth and has used bits set to 1 and
/// not used bits set to 0. /// not used bits set to 0.

View File

@ -319,7 +319,7 @@ void A57ChainingConstraint::addInterChainConstraint(PBQPRAGraph &G, unsigned Rd,
static bool regJustKilledBefore(const LiveIntervals &LIs, unsigned reg, static bool regJustKilledBefore(const LiveIntervals &LIs, unsigned reg,
const MachineInstr &MI) { const MachineInstr &MI) {
LiveInterval LI = LIs.getInterval(reg); const LiveInterval &LI = LIs.getInterval(reg);
SlotIndex SI = LIs.getInstructionIndex(&MI); SlotIndex SI = LIs.getInstructionIndex(&MI);
return LI.expiredAt(SI); return LI.expiredAt(SI);
} }

View File

@ -548,6 +548,7 @@ public:
} }
PhiState(Value *b) : status(Base), base(b) {} PhiState(Value *b) : status(Base), base(b) {}
PhiState() : status(Unknown), base(nullptr) {} PhiState() : status(Unknown), base(nullptr) {}
PhiState &operator=(const PhiState &) = default;
PhiState(const PhiState &other) : status(other.status), base(other.base) { PhiState(const PhiState &other) : status(other.status), base(other.base) {
assert(status != Base || base); assert(status != Base || base);
} }

View File

@ -40,6 +40,8 @@ namespace llvm {
public: public:
LogBuilder(Consumer &c, StringRef Format) LogBuilder(Consumer &c, StringRef Format)
: consumer(c), Format(Format) {} : consumer(c), Format(Format) {}
// Relying on RVO, not actually copyable.
LogBuilder(const LogBuilder&);
LogBuilder &operator<<(Value *V) { LogBuilder &operator<<(Value *V) {
Arguments.push_back(V); Arguments.push_back(V);

View File

@ -46,6 +46,7 @@ public:
CtorTester(const CtorTester &Arg) : Value(Arg.Value) { CtorTester(const CtorTester &Arg) : Value(Arg.Value) {
EXPECT_TRUE(Constructed.insert(this).second); EXPECT_TRUE(Constructed.insert(this).second);
} }
CtorTester &operator=(const CtorTester &) = default;
~CtorTester() { ~CtorTester() {
EXPECT_EQ(1u, Constructed.erase(this)); EXPECT_EQ(1u, Constructed.erase(this));
} }

View File

@ -21,7 +21,9 @@ struct Node : ilist_node<Node> {
int Value; int Value;
Node() {} Node() {}
Node(int _Value) : Value(_Value) {} Node(int Value) : Value(Value) {}
Node(const Node&) = default;
Node(Node &&RHS) : Value(RHS.Value) { RHS.Value = -1; }
~Node() { Value = -1; } ~Node() { Value = -1; }
}; };

View File

@ -441,6 +441,8 @@ struct MatchableInfo {
: AsmVariantID(0), AsmString(Alias->AsmString), TheDef(Alias->TheDef), DefRec(Alias.release()) { : AsmVariantID(0), AsmString(Alias->AsmString), TheDef(Alias->TheDef), DefRec(Alias.release()) {
} }
MatchableInfo(const MatchableInfo&) = default;
~MatchableInfo() { ~MatchableInfo() {
delete DefRec.dyn_cast<const CodeGenInstAlias*>(); delete DefRec.dyn_cast<const CodeGenInstAlias*>();
} }