@@ -116,10 +116,7 @@ class Value {
116116
117117private:
118118 Type *VTy;
119- union {
120- Use *List = nullptr ;
121- unsigned Count;
122- } Uses;
119+ Use *UseList;
123120
124121 friend class ValueAsMetadata ; // Allow access to IsUsedByMD.
125122 friend class ValueHandleBase ; // Allow access to HasValueHandle.
@@ -342,28 +339,21 @@ class Value {
342339#endif
343340 }
344341
345- // / Check if this Value has a use-list.
346- bool hasUseList () const { return !isa<ConstantData>(this ); }
347-
348342 bool use_empty () const {
349343 assertModuleIsMaterialized ();
350- return hasUseList () ? Uses. List == nullptr : Uses. Count == 0 ;
344+ return UseList == nullptr ;
351345 }
352346
353347 bool materialized_use_empty () const {
354- return hasUseList () ? Uses. List == nullptr : !Uses. Count ;
348+ return UseList == nullptr ;
355349 }
356350
357351 using use_iterator = use_iterator_impl<Use>;
358352 using const_use_iterator = use_iterator_impl<const Use>;
359353
360- use_iterator materialized_use_begin () {
361- assert (hasUseList ());
362- return use_iterator (Uses.List );
363- }
354+ use_iterator materialized_use_begin () { return use_iterator (UseList); }
364355 const_use_iterator materialized_use_begin () const {
365- assert (hasUseList ());
366- return const_use_iterator (Uses.List );
356+ return const_use_iterator (UseList);
367357 }
368358 use_iterator use_begin () {
369359 assertModuleIsMaterialized ();
@@ -390,18 +380,17 @@ class Value {
390380 return materialized_uses ();
391381 }
392382
393- bool user_empty () const { return use_empty (); }
383+ bool user_empty () const {
384+ assertModuleIsMaterialized ();
385+ return UseList == nullptr ;
386+ }
394387
395388 using user_iterator = user_iterator_impl<User>;
396389 using const_user_iterator = user_iterator_impl<const User>;
397390
398- user_iterator materialized_user_begin () {
399- assert (hasUseList ());
400- return user_iterator (Uses.List );
401- }
391+ user_iterator materialized_user_begin () { return user_iterator (UseList); }
402392 const_user_iterator materialized_user_begin () const {
403- assert (hasUseList ());
404- return const_user_iterator (Uses.List );
393+ return const_user_iterator (UseList);
405394 }
406395 user_iterator user_begin () {
407396 assertModuleIsMaterialized ();
@@ -440,11 +429,7 @@ class Value {
440429 // /
441430 // / This is specialized because it is a common request and does not require
442431 // / traversing the whole use list.
443- bool hasOneUse () const {
444- if (!hasUseList ())
445- return Uses.Count == 1 ;
446- return hasSingleElement (uses ());
447- }
432+ bool hasOneUse () const { return hasSingleElement (uses ()); }
448433
449434 // / Return true if this Value has exactly N uses.
450435 bool hasNUses (unsigned N) const ;
@@ -506,8 +491,6 @@ class Value {
506491 static void dropDroppableUse (Use &U);
507492
508493 // / Check if this value is used in the specified basic block.
509- // /
510- // / Not supported for ConstantData.
511494 bool isUsedInBasicBlock (const BasicBlock *BB) const ;
512495
513496 // / This method computes the number of uses of this Value.
@@ -517,19 +500,7 @@ class Value {
517500 unsigned getNumUses () const ;
518501
519502 // / This method should only be used by the Use class.
520- void addUse (Use &U) {
521- if (hasUseList ())
522- U.addToList (Uses.List );
523- else
524- U.addToList (Uses.Count );
525- }
526-
527- void removeUse (Use &U) {
528- if (hasUseList ())
529- U.removeFromList (Uses.List );
530- else
531- U.removeFromList (Uses.Count );
532- }
503+ void addUse (Use &U) { U.addToList (&UseList); }
533504
534505 // / Concrete subclass of this.
535506 // /
@@ -870,8 +841,7 @@ class Value {
870841 // /
871842 // / \return the first element in the list.
872843 // /
873- // / \note Completely ignores \a Use::PrevOrCount (doesn't read, doesn't
874- // / update).
844+ // / \note Completely ignores \a Use::Prev (doesn't read, doesn't update).
875845 template <class Compare >
876846 static Use *mergeUseLists (Use *L, Use *R, Compare Cmp) {
877847 Use *Merged;
@@ -917,50 +887,10 @@ inline raw_ostream &operator<<(raw_ostream &OS, const Value &V) {
917887 return OS;
918888}
919889
920- inline Use::~Use () {
921- if (Val)
922- Val->removeUse (*this );
923- }
924-
925- void Use::addToList (unsigned &Count) {
926- assert (isa<ConstantData>(Val) && " Only ConstantData is ref-counted" );
927- ++Count;
928-
929- // We don't have a uselist - clear the remnant if we are replacing a
930- // non-constant value.
931- Prev = nullptr ;
932- Next = nullptr ;
933- }
934-
935- void Use::addToList (Use *&List) {
936- assert (!isa<ConstantData>(Val) && " ConstantData has no use-list" );
937-
938- Next = List;
939- if (Next)
940- Next->Prev = &Next;
941- Prev = &List;
942- List = this ;
943- }
944-
945- void Use::removeFromList (unsigned &Count) {
946- assert (isa<ConstantData>(Val));
947- assert (Count > 0 && " reference count underflow" );
948- assert (!Prev && !Next && " should not have uselist remnant" );
949- --Count;
950- }
951-
952- void Use::removeFromList (Use *&List) {
953- *Prev = Next;
954- if (Next)
955- Next->Prev = Prev;
956- }
957-
958890void Use::set (Value *V) {
959- if (Val)
960- Val->removeUse (*this );
891+ if (Val) removeFromList ();
961892 Val = V;
962- if (V)
963- V->addUse (*this );
893+ if (V) V->addUse (*this );
964894}
965895
966896Value *Use::operator =(Value *RHS) {
@@ -974,7 +904,7 @@ const Use &Use::operator=(const Use &RHS) {
974904}
975905
976906template <class Compare > void Value::sortUseList (Compare Cmp) {
977- if (!hasUseList () || !Uses. List || !Uses. List ->Next )
907+ if (!UseList || !UseList ->Next )
978908 // No need to sort 0 or 1 uses.
979909 return ;
980910
@@ -987,10 +917,10 @@ template <class Compare> void Value::sortUseList(Compare Cmp) {
987917 Use *Slots[MaxSlots];
988918
989919 // Collect the first use, turning it into a single-item list.
990- Use *Next = Uses. List ->Next ;
991- Uses. List ->Next = nullptr ;
920+ Use *Next = UseList ->Next ;
921+ UseList ->Next = nullptr ;
992922 unsigned NumSlots = 1 ;
993- Slots[0 ] = Uses. List ;
923+ Slots[0 ] = UseList ;
994924
995925 // Collect all but the last use.
996926 while (Next->Next ) {
@@ -1026,15 +956,15 @@ template <class Compare> void Value::sortUseList(Compare Cmp) {
1026956 // Merge all the lists together.
1027957 assert (Next && " Expected one more Use" );
1028958 assert (!Next->Next && " Expected only one Use" );
1029- Uses. List = Next;
959+ UseList = Next;
1030960 for (unsigned I = 0 ; I < NumSlots; ++I)
1031961 if (Slots[I])
1032- // Since the uses in Slots[I] originally preceded those in Uses.List , send
962+ // Since the uses in Slots[I] originally preceded those in UseList , send
1033963 // Slots[I] in as the left parameter to maintain a stable sort.
1034- Uses. List = mergeUseLists (Slots[I], Uses. List , Cmp);
964+ UseList = mergeUseLists (Slots[I], UseList , Cmp);
1035965
1036966 // Fix the Prev pointers.
1037- for (Use *I = Uses. List , **Prev = &Uses. List ; I; I = I->Next ) {
967+ for (Use *I = UseList , **Prev = &UseList ; I; I = I->Next ) {
1038968 I->Prev = Prev;
1039969 Prev = &I->Next ;
1040970 }
0 commit comments