From: Matthias Braun Date: Mon, 5 Dec 2016 06:41:47 +0000 (+0000) Subject: ListInit::convertInitializerTo: avoid foldingset lookup if nothing changed X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ba1a51cf5676488e885d7097fd07875fae44da3;p=llvm ListInit::convertInitializerTo: avoid foldingset lookup if nothing changed git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288647 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/TableGen/Record.cpp b/lib/TableGen/Record.cpp index 2875375f4cd..de13cd2246a 100644 --- a/lib/TableGen/Record.cpp +++ b/lib/TableGen/Record.cpp @@ -533,19 +533,28 @@ void ListInit::Profile(FoldingSetNodeID &ID) const { } Init *ListInit::convertInitializerTo(RecTy *Ty) const { + if (getType() == Ty) + return const_cast(this); + if (auto *LRT = dyn_cast(Ty)) { std::vector Elements; + Elements.reserve(getValues().size()); // Verify that all of the elements of the list are subclasses of the // appropriate class! + bool Changed = false; + RecTy *ElementType = LRT->getElementType(); for (Init *I : getValues()) - if (Init *CI = I->convertInitializerTo(LRT->getElementType())) + if (Init *CI = I->convertInitializerTo(ElementType)) { Elements.push_back(CI); - else + if (CI != I) + Changed = true; + } else return nullptr; - if (isa(getType())) - return ListInit::get(Elements, Ty); + if (!Changed) + return const_cast(this); + return ListInit::get(Elements, Ty); } return nullptr;