1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 02:33:06 +01:00
llvm-mirror/unittests/ADT
Duncan P. N. Exon Smith 66bedcb549 ADT: Fix reference invalidation in SmallVector::emplace_back and assign(N,V)
This fixes the final (I think?) reference invalidation in `SmallVector`
that we need to fix to align with `std::vector`. (There is still some
left in the range insert / append / assign, but the standard calls that
UB for `std::vector` so I think we don't care?)

For POD-like types, reimplement `emplace_back()` in terms of
`push_back()`, taking a copy even for large `T` rather than lose the
realloc optimization in `grow_pod()`.

For other types, split the grow operation in three and construct the new
element in the middle.

- `mallocForGrow()` calculates the new capacity and returns the result
  of `safe_malloc()`. We only need a single definition per
  `SmallVectorBase` so this is defined in SmallVector.cpp to avoid code
  size bloat. Moving this part of non-POD grow to the source file also
  allows the logic to be easily shared with `grow_pod`, and
  `report_size_overflow()` and `report_at_maximum_capacity()` can move
  there too.
- `moveElementsForGrow()` moves elements from the old to the new
  allocation.
- `takeAllocationForGrow()` frees the old allocation and saves the
  new allocation and capacity .

`SmallVector:assign(size_type, const T&)` also uses the split-grow
operations for non-POD, but it also has a semantic change when not
growing. Previously, assign would start with `clear()`, and so the old
elements were destructed and all elements of the new vector were
copy-constructed (potentially invalidating references). The new
implementation skips destruction and uses copy-assignment for the prefix
of the new vector that fits. The new semantics match what libc++ does
for `std::vector::assign()`.

Note that the following is another possible implementation:
```
  void assign(size_type NumElts, ValueParamT Elt) {
    std::fill_n(this->begin(), std::min(NumElts, this->size()), Elt);
    this->resize(NumElts, Elt);
  }
```
The downside of this simpler implementation is that if the vector has to
grow there will be `size()` redundant copy operations.

(I had planned on splitting this patch up into three for committing
(after getting performance numbers / initial review), but I've realized
that if this does for some reason need to be reverted we'll probably
want to revert the whole package...)

Differential Revision: https://reviews.llvm.org/D94739
2021-01-21 12:11:41 -08:00
..
AnyTest.cpp
APFixedPointTest.cpp [Fixed Point] Add floating point methods to APFixedPoint. 2020-10-09 10:27:42 +02:00
APFloatTest.cpp [APFloat] convert SNaN to QNaN in convert() and raise Invalid signal 2020-10-01 14:37:38 -04:00
APIntTest.cpp [APInt] Add the truncOrSelf resizing operator to APInt 2020-11-23 11:27:30 +00:00
APSIntTest.cpp ADT: Fix that APSInt's string constructor claims it requires 5 bits to store a zero 2020-06-10 16:36:33 +02:00
ArrayRefTest.cpp Switch from llvm::is_trivially_copyable to std::is_trivially_copyable 2020-12-02 22:02:48 -08:00
BitFieldsTest.cpp [Bitfields][NFC] Make sure bitfields are contiguous 2020-07-07 14:35:13 +00:00
BitmaskEnumTest.cpp
BitVectorTest.cpp Fix bug in SmallBitVector::find_next_unset 2020-04-24 13:50:30 -07:00
BreadthFirstIteratorTest.cpp
BumpPtrListTest.cpp
CMakeLists.txt [ADT] Move FixedPoint.h from Clang to LLVM. 2020-08-20 10:29:45 +02:00
CoalescingBitVectorTest.cpp [LiveDebugValues] Speed up removeEntryValue, NFC 2020-06-01 11:02:36 -07:00
DAGDeltaAlgorithmTest.cpp
DeltaAlgorithmTest.cpp
DenseMapTest.cpp [ADT] Allow K to be incomplete during DenseMap<K*, V> instantiation 2020-02-28 14:24:04 -08:00
DenseSetTest.cpp [llvm] Add contains(KeyType) -> bool methods to DenseSet 2020-07-17 11:26:26 -07:00
DepthFirstIteratorTest.cpp
DirectedGraphTest.cpp
EnumeratedArrayTest.cpp [DDG] Data Dependence Graph - Pi Block 2019-11-08 15:46:08 -05:00
EquivalenceClassesTest.cpp
FallibleIteratorTest.cpp
FloatingPointMode.cpp Separately track input and output denormal mode 2020-02-04 12:59:21 -05:00
FoldingSet.cpp
FunctionExtrasTest.cpp Reland [ADT] Support const-qualified unique_functions 2020-06-29 21:40:16 +02:00
FunctionRefTest.cpp [ADT] Fix accidental pointer comparison in test 2020-10-27 18:11:45 +01:00
HashingTest.cpp Add hashing support for std::tuple 2020-07-16 19:01:25 +02:00
IListBaseTest.cpp
IListIteratorTest.cpp
IListNodeBaseTest.cpp
IListNodeTest.cpp
IListSentinelTest.cpp
IListTest.cpp
ImmutableListTest.cpp Switch from llvm::is_trivially_copyable to std::is_trivially_copyable 2020-12-02 22:02:48 -08:00
ImmutableMapTest.cpp [ADT] Fix for ImmutableMapRef 2020-10-29 13:19:51 +01:00
ImmutableSetTest.cpp
IntEqClassesTest.cpp
IntervalMapTest.cpp [ADT] Add CoalescingBitVector, implemented using IntervalMap [1/3] 2020-02-27 12:39:46 -08:00
IntrusiveRefCntPtrTest.cpp [ADT] Add makeIntrusiveRefCnt helper function 2021-01-11 20:12:53 +00:00
IteratorTest.cpp [ADT] Move drop_begin from iterator_range.h into STLExtras. 2019-11-14 08:10:59 -08:00
MappedIteratorTest.cpp
MapVectorTest.cpp Github access test: remove unnecessary whitespaces. 2020-05-20 09:53:44 +01:00
OptionalTest.cpp Fix llvm::Optional build breaks in MSVC using std::is_trivially_copyable 2021-01-16 09:37:04 -05:00
PackedVectorTest.cpp
PointerEmbeddedIntTest.cpp PointerLikeTypeTraits: Standardize NumLowBitsAvailable on static constexpr rather than anonymous enum 2020-01-16 15:30:50 -08:00
PointerIntPairTest.cpp Switch from llvm::is_trivially_copyable to std::is_trivially_copyable 2020-12-02 22:02:48 -08:00
PointerSumTypeTest.cpp
PointerUnionTest.cpp Removed PointerUnion3 and PointerUnion4 aliases in favor of the variadic template 2020-01-14 18:56:29 +01:00
PostOrderIteratorTest.cpp
PriorityWorklistTest.cpp
RangeAdapterTest.cpp
SCCIteratorTest.cpp
ScopeExitTest.cpp
SequenceTest.cpp
SetVectorTest.cpp [llvm] Add contains(KeyType) -> bool methods to SetVector 2020-07-17 11:26:27 -07:00
SimpleIListTest.cpp [ADT/STLExtras.h] - Add llvm::is_sorted wrapper and update callers. 2020-04-14 14:11:02 +03:00
SmallPtrSetTest.cpp [llvm] Add contains(KeyType) -> bool methods to SmallPtrSet 2020-07-17 11:26:27 -07:00
SmallSetTest.cpp [llvm] Add contains(KeyType) -> bool methods to SmallSet 2020-07-17 11:26:27 -07:00
SmallStringTest.cpp [ADT] Add methods to SmallString for efficient concatenation 2020-10-30 10:07:40 +00:00
SmallVectorTest.cpp ADT: Fix reference invalidation in SmallVector::emplace_back and assign(N,V) 2021-01-21 12:11:41 -08:00
SparseBitVectorTest.cpp
SparseMultiSetTest.cpp
SparseSetTest.cpp [llvm] Add contains(KeyType) -> bool methods to SparseSet 2020-07-17 11:26:27 -07:00
StatisticTest.cpp
STLExtrasTest.cpp [STLExtras] Add a default value to drop_begin 2021-01-18 10:16:34 -08:00
StringExtrasTest.cpp [StringExtras] Rename SubsequentDelim to ListSeparator 2021-01-15 21:00:56 -08:00
StringMapTest.cpp [clang-tidy] remove duplicate fixes of alias checkers 2020-06-19 20:40:59 +01:00
StringRefTest.cpp Switch from llvm::is_trivially_copyable to std::is_trivially_copyable 2020-12-02 22:02:48 -08:00
StringSetTest.cpp [llvm] Add contains(KeyType) -> bool methods to StringSet 2020-07-17 11:26:27 -07:00
StringSwitchTest.cpp
TestGraph.h [ADT] Fixed -Wdeprecated-copy warning. NFCI 2019-11-28 00:49:42 +01:00
TinyPtrVectorTest.cpp
TripleTest.cpp Fix failing triple test for macOS 11 with non-zero minor versions. 2021-01-06 14:57:37 -08:00
TwineTest.cpp [llvm][NFC] Add missing 'override's in unittests/ 2020-07-17 17:35:59 -07:00
TypeSwitchTest.cpp [llvm][ADT] Move TypeSwitch class from MLIR to LLVM 2020-04-14 15:14:41 -07:00
TypeTraitsTest.cpp [mlir][NFC] Remove the STLExtras.h header file now that it has been merged into LLVM. 2020-04-14 15:14:41 -07:00
WaymarkingTest.cpp [ADT] Implement the Waymarking as an independent utility 2020-03-31 17:08:24 +03:00