diff options
Diffstat (limited to 'lib/TableGen')
-rw-r--r-- | lib/TableGen/Record.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
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<ListInit*>(this); + if (auto *LRT = dyn_cast<ListRecTy>(Ty)) { std::vector<Init*> 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<ListRecTy>(getType())) - return ListInit::get(Elements, Ty); + if (!Changed) + return const_cast<ListInit*>(this); + return ListInit::get(Elements, Ty); } return nullptr; |