diff options
| author | Will Dietz <wdietz2@illinois.edu> | 2013-10-16 04:10:06 +0000 |
|---|---|---|
| committer | Will Dietz <wdietz2@illinois.edu> | 2013-10-16 04:10:06 +0000 |
| commit | 70b66f0df2a1322dabb807c0e5d57f447e1731ff (patch) | |
| tree | 019d6f36fdc155f8a65a0d100718650a8061097a /llvm/lib | |
| parent | 50a86e125afb381f395e8cbd6a40e825262aa828 (diff) | |
| download | bcm5719-llvm-70b66f0df2a1322dabb807c0e5d57f447e1731ff.tar.gz bcm5719-llvm-70b66f0df2a1322dabb807c0e5d57f447e1731ff.zip | |
TypeFinder: prefer iterative algorithm to keep stack usage low.
Introduce subtype_reverse_iterator to maintain
the numbering assigned during the recursive type walk.
llvm-svn: 192770
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/TypeFinder.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/llvm/lib/IR/TypeFinder.cpp b/llvm/lib/IR/TypeFinder.cpp index dd933026ea7..689b9038913 100644 --- a/llvm/lib/IR/TypeFinder.cpp +++ b/llvm/lib/IR/TypeFinder.cpp @@ -94,19 +94,27 @@ void TypeFinder::clear() { /// incorporateType - This method adds the type to the list of used structures /// if it's not in there already. void TypeFinder::incorporateType(Type *Ty) { - // Check to see if we're already visited this type. + // Check to see if we've already visited this type. if (!VisitedTypes.insert(Ty).second) return; - // If this is a structure or opaque type, add a name for the type. - if (StructType *STy = dyn_cast<StructType>(Ty)) - if (!OnlyNamed || STy->hasName()) - StructTypes.push_back(STy); - - // Recursively walk all contained types. - for (Type::subtype_iterator I = Ty->subtype_begin(), - E = Ty->subtype_end(); I != E; ++I) - incorporateType(*I); + SmallVector<Type *, 4> TypeWorklist; + TypeWorklist.push_back(Ty); + do { + Ty = TypeWorklist.pop_back_val(); + + // If this is a structure or opaque type, add a name for the type. + if (StructType *STy = dyn_cast<StructType>(Ty)) + if (!OnlyNamed || STy->hasName()) + StructTypes.push_back(STy); + + // Add all unvisited subtypes to worklist for processing + for (Type::subtype_reverse_iterator I = Ty->subtype_rbegin(), + E = Ty->subtype_rend(); + I != E; ++I) + if (VisitedTypes.insert(*I).second) + TypeWorklist.push_back(*I); + } while (!TypeWorklist.empty()); } /// incorporateValue - This method is used to walk operand lists finding types |

