[lld] r204523 - Use early continues to reduce nesting.
Rui Ueyama
ruiu at google.com
Fri Mar 21 14:46:50 PDT 2014
Author: ruiu
Date: Fri Mar 21 16:46:49 2014
New Revision: 204523
URL: http://llvm.org/viewvc/llvm-project?rev=204523&view=rev
Log:
Use early continues to reduce nesting.
Modified:
lld/trunk/lib/Passes/LayoutPass.cpp
Modified: lld/trunk/lib/Passes/LayoutPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/LayoutPass.cpp?rev=204523&r1=204522&r2=204523&view=diff
==============================================================================
--- lld/trunk/lib/Passes/LayoutPass.cpp (original)
+++ lld/trunk/lib/Passes/LayoutPass.cpp Fri Mar 21 16:46:49 2014
@@ -333,9 +333,8 @@ void LayoutPass::buildFollowOnTable(Muta
_followOnNexts.resize(range.size());
for (const DefinedAtom *ai : range) {
for (const Reference *r : *ai) {
- if (r->kindNamespace() != lld::Reference::KindNamespace::all)
- continue;
- if (r->kindValue() != lld::Reference::kindLayoutAfter)
+ if (r->kindNamespace() != lld::Reference::KindNamespace::all ||
+ r->kindValue() != lld::Reference::kindLayoutAfter)
continue;
const DefinedAtom *targetAtom = dyn_cast<DefinedAtom>(r->target());
_followOnNexts[ai] = targetAtom;
@@ -350,31 +349,33 @@ void LayoutPass::buildFollowOnTable(Muta
// If the targetAtom is not a root of any chain, let's make the root of
// the targetAtom to the root of the current chain.
_followOnRoots[targetAtom] = _followOnRoots[ai];
- } else if (iter->second == targetAtom) {
+ continue;
+ }
+ if (iter->second == targetAtom) {
// If the targetAtom is the root of a chain, the chain becomes part of
// the current chain. Rewrite the subchain's root to the current
// chain's root.
setChainRoot(targetAtom, _followOnRoots[ai]);
- } else {
- // The targetAtom is already a part of a chain. If the current atom is
- // of size zero, we can insert it in the middle of the chain just
- // before the target atom, while not breaking other atom's followon
- // relationships. If it's not, we can only insert the current atom at
- // the beginning of the chain. All the atoms followed by the target
- // atom must be of size zero in that case to satisfy the followon
- // relationships.
- size_t currentAtomSize = ai->size();
- if (currentAtomSize == 0) {
- const DefinedAtom *targetPrevAtom = findAtomFollowedBy(targetAtom);
- _followOnNexts[targetPrevAtom] = ai;
- _followOnRoots[ai] = _followOnRoots[targetPrevAtom];
- } else {
- if (!checkAllPrevAtomsZeroSize(targetAtom))
- break;
- _followOnNexts[ai] = _followOnRoots[targetAtom];
- setChainRoot(_followOnRoots[targetAtom], _followOnRoots[ai]);
- }
+ continue;
+ }
+ // The targetAtom is already a part of a chain. If the current atom is
+ // of size zero, we can insert it in the middle of the chain just
+ // before the target atom, while not breaking other atom's followon
+ // relationships. If it's not, we can only insert the current atom at
+ // the beginning of the chain. All the atoms followed by the target
+ // atom must be of size zero in that case to satisfy the followon
+ // relationships.
+ size_t currentAtomSize = ai->size();
+ if (currentAtomSize == 0) {
+ const DefinedAtom *targetPrevAtom = findAtomFollowedBy(targetAtom);
+ _followOnNexts[targetPrevAtom] = ai;
+ _followOnRoots[ai] = _followOnRoots[targetPrevAtom];
+ continue;
}
+ if (!checkAllPrevAtomsZeroSize(targetAtom))
+ break;
+ _followOnNexts[ai] = _followOnRoots[targetAtom];
+ setChainRoot(_followOnRoots[targetAtom], _followOnRoots[ai]);
}
}
}
@@ -396,54 +397,53 @@ void LayoutPass::buildInGroupTable(Mutab
// references so that we have only one table
for (const DefinedAtom *ai : range) {
for (const Reference *r : *ai) {
- if (r->kindNamespace() != lld::Reference::KindNamespace::all)
+ if (r->kindNamespace() != lld::Reference::KindNamespace::all ||
+ r->kindValue() != lld::Reference::kindInGroup)
continue;
- if (r->kindValue() == lld::Reference::kindInGroup) {
- const DefinedAtom *rootAtom = dyn_cast<DefinedAtom>(r->target());
- // If the root atom is not part of any root
- // create a new root
- if (_followOnRoots.count(rootAtom) == 0) {
- _followOnRoots[rootAtom] = rootAtom;
- }
- // If the current Atom has not been seen yet and there is no root
- // that has been set, set the root of the atom to the targetAtom
- // as the targetAtom points to the ingroup root
- auto iter = _followOnRoots.find(ai);
- if (iter == _followOnRoots.end()) {
- _followOnRoots[ai] = rootAtom;
- } else if (iter->second == ai) {
- if (iter->second != rootAtom)
- setChainRoot(iter->second, rootAtom);
- } else {
- // TODO : Flag an error that the root of the tree
- // is different, Here is an example
- // Say there are atoms
- // chain 1 : a->b->c
- // chain 2 : d->e->f
- // and e,f have their ingroup reference as a
- // this could happen only if the root of e,f that is d
- // has root as 'a'
- continue;
- }
+ const DefinedAtom *rootAtom = dyn_cast<DefinedAtom>(r->target());
+ // If the root atom is not part of any root
+ // create a new root
+ if (_followOnRoots.count(rootAtom) == 0) {
+ _followOnRoots[rootAtom] = rootAtom;
+ }
+ // If the current Atom has not been seen yet and there is no root
+ // that has been set, set the root of the atom to the targetAtom
+ // as the targetAtom points to the ingroup root
+ auto iter = _followOnRoots.find(ai);
+ if (iter == _followOnRoots.end()) {
+ _followOnRoots[ai] = rootAtom;
+ } else if (iter->second == ai) {
+ if (iter->second != rootAtom)
+ setChainRoot(iter->second, rootAtom);
+ } else {
+ // TODO : Flag an error that the root of the tree
+ // is different, Here is an example
+ // Say there are atoms
+ // chain 1 : a->b->c
+ // chain 2 : d->e->f
+ // and e,f have their ingroup reference as a
+ // this could happen only if the root of e,f that is d
+ // has root as 'a'
+ continue;
+ }
- // Check if the current atom is part of the chain
- bool isAtomInChain = false;
- const DefinedAtom *lastAtom = rootAtom;
- for (;;) {
- AtomToAtomT::iterator followOnAtomsIter =
- _followOnNexts.find(lastAtom);
- if (followOnAtomsIter != _followOnNexts.end()) {
- lastAtom = followOnAtomsIter->second;
- if (lastAtom != ai)
- continue;
- isAtomInChain = true;
- }
- break;
+ // Check if the current atom is part of the chain
+ bool isAtomInChain = false;
+ const DefinedAtom *lastAtom = rootAtom;
+ for (;;) {
+ AtomToAtomT::iterator followOnAtomsIter =
+ _followOnNexts.find(lastAtom);
+ if (followOnAtomsIter != _followOnNexts.end()) {
+ lastAtom = followOnAtomsIter->second;
+ if (lastAtom != ai)
+ continue;
+ isAtomInChain = true;
}
-
- if (!isAtomInChain)
- _followOnNexts[lastAtom] = ai;
+ break;
}
+
+ if (!isAtomInChain)
+ _followOnNexts[lastAtom] = ai;
}
}
}
@@ -468,50 +468,53 @@ void LayoutPass::buildPrecededByTable(Mu
// references so that we have only one table
for (const DefinedAtom *ai : range) {
for (const Reference *r : *ai) {
- if (r->kindNamespace() != lld::Reference::KindNamespace::all)
+ if (r->kindNamespace() != lld::Reference::KindNamespace::all ||
+ r->kindValue() != lld::Reference::kindLayoutBefore)
continue;
- if (r->kindValue() == lld::Reference::kindLayoutBefore) {
- const DefinedAtom *targetAtom = dyn_cast<DefinedAtom>(r->target());
- // Is the targetAtom not chained
- if (_followOnRoots.count(targetAtom) == 0) {
- // Is the current atom not part of any root ?
- if (_followOnRoots.count(ai) == 0) {
- _followOnRoots[ai] = ai;
- _followOnNexts[ai] = targetAtom;
- _followOnRoots[targetAtom] = _followOnRoots[ai];
- } else if (_followOnNexts.count(ai) == 0) {
- // Chain the targetAtom to the current Atom
- // if the currentAtom has no followon references
- _followOnNexts[ai] = targetAtom;
- _followOnRoots[targetAtom] = _followOnRoots[ai];
- }
- } else if (_followOnRoots.find(targetAtom)->second == targetAtom) {
- // Is the targetAtom in chain with the targetAtom as the root ?
- bool changeRoots = false;
- if (_followOnRoots.count(ai) == 0) {
- _followOnRoots[ai] = ai;
- _followOnNexts[ai] = targetAtom;
- _followOnRoots[targetAtom] = _followOnRoots[ai];
- changeRoots = true;
- } else if (_followOnNexts.count(ai) == 0) {
- // Chain the targetAtom to the current Atom
- // if the currentAtom has no followon references
- if (_followOnRoots[ai] != _followOnRoots[targetAtom]) {
- _followOnNexts[ai] = targetAtom;
- _followOnRoots[targetAtom] = _followOnRoots[ai];
- changeRoots = true;
- }
- }
- // Change the roots of the targetAtom and its chain to
- // the current atoms root
- if (changeRoots) {
- setChainRoot(_followOnRoots[targetAtom], _followOnRoots[ai]);
- }
- } // Is targetAtom root
- } // kindLayoutBefore
- } // Reference
- } // atom iteration
-} // end function
+ const DefinedAtom *targetAtom = dyn_cast<DefinedAtom>(r->target());
+ // Is the targetAtom not chained
+ if (_followOnRoots.count(targetAtom) == 0) {
+ // Is the current atom not part of any root?
+ if (_followOnRoots.count(ai) == 0) {
+ _followOnRoots[ai] = ai;
+ _followOnNexts[ai] = targetAtom;
+ _followOnRoots[targetAtom] = _followOnRoots[ai];
+ continue;
+ }
+ if (_followOnNexts.count(ai) == 0) {
+ // Chain the targetAtom to the current Atom
+ // if the currentAtom has no followon references
+ _followOnNexts[ai] = targetAtom;
+ _followOnRoots[targetAtom] = _followOnRoots[ai];
+ }
+ continue;
+ }
+ if (_followOnRoots.find(targetAtom)->second != targetAtom)
+ continue;
+ // Is the targetAtom in chain with the targetAtom as the root?
+ bool changeRoots = false;
+ if (_followOnRoots.count(ai) == 0) {
+ _followOnRoots[ai] = ai;
+ _followOnNexts[ai] = targetAtom;
+ _followOnRoots[targetAtom] = _followOnRoots[ai];
+ changeRoots = true;
+ } else if (_followOnNexts.count(ai) == 0) {
+ // Chain the targetAtom to the current Atom
+ // if the currentAtom has no followon references
+ if (_followOnRoots[ai] != _followOnRoots[targetAtom]) {
+ _followOnNexts[ai] = targetAtom;
+ _followOnRoots[targetAtom] = _followOnRoots[ai];
+ changeRoots = true;
+ }
+ }
+ // Change the roots of the targetAtom and its chain to
+ // the current atoms root
+ if (changeRoots) {
+ setChainRoot(_followOnRoots[targetAtom], _followOnRoots[ai]);
+ }
+ }
+ }
+}
/// Build an ordinal override map by traversing the followon chain, and
@@ -526,13 +529,13 @@ void LayoutPass::buildOrdinalOverrideMap
if (_ordinalOverrideMap.find(atom) != _ordinalOverrideMap.end())
continue;
AtomToAtomT::iterator start = _followOnRoots.find(atom);
- if (start != _followOnRoots.end()) {
- for (const DefinedAtom *nextAtom = start->second; nextAtom != NULL;
- nextAtom = _followOnNexts[nextAtom]) {
- AtomToOrdinalT::iterator pos = _ordinalOverrideMap.find(nextAtom);
- if (pos == _ordinalOverrideMap.end())
- _ordinalOverrideMap[nextAtom] = index++;
- }
+ if (start == _followOnRoots.end())
+ continue;
+ for (const DefinedAtom *nextAtom = start->second; nextAtom != NULL;
+ nextAtom = _followOnNexts[nextAtom]) {
+ AtomToOrdinalT::iterator pos = _ordinalOverrideMap.find(nextAtom);
+ if (pos == _ordinalOverrideMap.end())
+ _ordinalOverrideMap[nextAtom] = index++;
}
}
}
More information about the llvm-commits
mailing list