From 26b7bf38ac14e6b01d6a267235dbcf1313711c24 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Wed, 18 Nov 2015 08:30:07 +0000 Subject: [PATCH] [OperandBundles] Tighten OperandBundleDef's interface; NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253446 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/InstrTypes.h | 25 +++++++++++++++++-------- lib/AsmParser/LLParser.cpp | 12 +++++------- lib/Bitcode/Reader/BitcodeReader.cpp | 6 ++---- lib/Transforms/Utils/InlineFunction.cpp | 2 +- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/include/llvm/IR/InstrTypes.h b/include/llvm/IR/InstrTypes.h index f0035ca3d42..e6ebc87d1e0 100644 --- a/include/llvm/IR/InstrTypes.h +++ b/include/llvm/IR/InstrTypes.h @@ -1155,21 +1155,30 @@ private: /// Unlike OperandBundleUse, OperandBundleDefT owns the memory it carries, and /// so it is possible to create and pass around "self-contained" instances of /// OperandBundleDef and ConstOperandBundleDef. -template struct OperandBundleDefT { +template class OperandBundleDefT { std::string Tag; std::vector Inputs; - OperandBundleDefT() {} - explicit OperandBundleDefT(StringRef Tag, const std::vector &Inputs) +public: + explicit OperandBundleDefT(StringRef Tag, std::vector &&Inputs) : Tag(Tag), Inputs(Inputs) {} - explicit OperandBundleDefT(StringRef Tag, std::vector &&Inputs) + explicit OperandBundleDefT(std::string &&Tag, std::vector &&Inputs) : Tag(Tag), Inputs(Inputs) {} explicit OperandBundleDefT(const OperandBundleUse &OBU) { Tag = OBU.getTagName(); Inputs.insert(Inputs.end(), OBU.Inputs.begin(), OBU.Inputs.end()); } + + ArrayRef getInputs() const { return Inputs; } + + typedef typename std::vector::const_iterator input_iterator; + size_t input_size() const { return Inputs.size(); } + input_iterator input_begin() const { return Inputs.begin(); } + input_iterator input_end() const { return Inputs.end(); } + + StringRef getTag() const { return Tag; } }; typedef OperandBundleDefT OperandBundleDef; @@ -1461,7 +1470,7 @@ protected: const unsigned BeginIndex) { auto It = static_cast(this)->op_begin() + BeginIndex; for (auto &B : Bundles) - It = std::copy(B.Inputs.begin(), B.Inputs.end(), It); + It = std::copy(B.input_begin(), B.input_end(), It); auto *ContextImpl = static_cast(this)->getContext().pImpl; auto BI = Bundles.begin(); @@ -1470,9 +1479,9 @@ protected: for (auto &BOI : bundle_op_infos()) { assert(BI != Bundles.end() && "Incorrect allocation?"); - BOI.Tag = ContextImpl->getOrInsertBundleTag(BI->Tag); + BOI.Tag = ContextImpl->getOrInsertBundleTag(BI->getTag()); BOI.Begin = CurrentIndex; - BOI.End = CurrentIndex + BI->Inputs.size(); + BOI.End = CurrentIndex + BI->input_size(); CurrentIndex = BOI.End; BI++; } @@ -1486,7 +1495,7 @@ protected: static unsigned CountBundleInputs(ArrayRef Bundles) { unsigned Total = 0; for (auto &B : Bundles) - Total += B.Inputs.size(); + Total += B.input_size(); return Total; } }; diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 2c6e8081c13..2d09b18a901 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -1972,17 +1972,13 @@ bool LLParser::ParseOptionalOperandBundles( if (ParseStringConstant(Tag)) return true; - BundleList.emplace_back(); - auto &OBI = BundleList.back(); - - OBI.Tag = std::move(Tag); - if (ParseToken(lltok::lparen, "expected '(' in operand bundle")) return true; + std::vector Inputs; while (Lex.getKind() != lltok::rparen) { // If this isn't the first input, we need a comma. - if (!OBI.Inputs.empty() && + if (!Inputs.empty() && ParseToken(lltok::comma, "expected ',' in input list")) return true; @@ -1990,9 +1986,11 @@ bool LLParser::ParseOptionalOperandBundles( Value *Input = nullptr; if (ParseType(Ty) || ParseValue(Ty, Input, PFS)) return true; - OBI.Inputs.push_back(Input); + Inputs.push_back(Input); } + BundleList.emplace_back(std::move(Tag), std::move(Inputs)); + Lex.Lex(); // Lex the ')'. } diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 3a2d5be21db..9210042e6ed 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -5120,10 +5120,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) { if (Record.size() < 1 || Record[0] >= BundleTags.size()) return error("Invalid record"); - OperandBundles.emplace_back(); - OperandBundles.back().Tag = BundleTags[Record[0]]; - - std::vector &Inputs = OperandBundles.back().Inputs; + std::vector Inputs; unsigned OpNum = 1; while (OpNum != Record.size()) { @@ -5133,6 +5130,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) { Inputs.push_back(Op); } + OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs)); continue; } } diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index dfb028111e9..a31131bd4ac 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -1195,7 +1195,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, MergedDeoptArgs.insert(MergedDeoptArgs.end(), ChildOB.Inputs.begin(), ChildOB.Inputs.end()); - OpDefs.emplace_back("deopt", std::move(MergedDeoptArgs)); + OpDefs.emplace_back(StringRef("deopt"), std::move(MergedDeoptArgs)); } Instruction *NewI = nullptr; -- 2.34.1