Revert r317040: [globalisel][tablegen] Keep track of the insertion point while adding BuildMIAction's. NFC

The same bots fail but I believe I know what the issue is now. These bots are
missing the const_iterator versions of insert/emplace/etc. that were introduced
in C++11.

llvm-svn: 317042
This commit is contained in:
Daniel Sanders 2017-10-31 21:54:52 +00:00
parent bc6f52da82
commit f69d1b018c

View File

@ -517,11 +517,6 @@ class MatchAction;
/// Generates code to check that a match rule matches.
class RuleMatcher {
public:
using ActionVec = std::vector<std::unique_ptr<MatchAction>>;
using const_action_iterator = ActionVec::const_iterator;
protected:
/// A list of matchers that all need to succeed for the current rule to match.
/// FIXME: This currently supports a single match position but could be
/// extended to support multiple positions to support div/rem fusion or
@ -530,7 +525,7 @@ protected:
/// A list of actions that need to be taken when all predicates in this rule
/// have succeeded.
ActionVec Actions;
std::vector<std::unique_ptr<MatchAction>> Actions;
using DefinedInsnVariablesMap =
std::map<const InstructionMatcher *, unsigned>;
@ -576,9 +571,6 @@ public:
const std::vector<Record *> &getRequiredFeatures() const;
template <class Kind, class... Args> Kind &addAction(Args &&... args);
template <class Kind, class... Args>
const_action_iterator insertAction(const_action_iterator InsertPt,
Args &&... args);
/// Define an instruction without emitting any code to do so.
/// This is used for the root of the match.
@ -614,12 +606,6 @@ public:
(void)R;
}
const_action_iterator actions_begin() const { return Actions.begin(); }
const_action_iterator actions_end() const { return Actions.end(); }
iterator_range<const_action_iterator> actions() const {
return make_range(actions_begin(), actions_end());
}
void defineOperand(StringRef SymbolicName, OperandMatcher &OM);
void defineComplexSubOperand(StringRef SymbolicName, Record *ComplexPattern,
@ -656,8 +642,6 @@ public:
InstructionMatcher &insnmatcher_front() const { return *Matchers.front(); }
};
using const_action_iterator = RuleMatcher::const_action_iterator;
template <class PredicateTy> class PredicateListMatcher {
private:
typedef std::vector<std::unique_ptr<PredicateTy>> PredicateVec;
@ -1958,30 +1942,11 @@ const std::vector<Record *> &RuleMatcher::getRequiredFeatures() const {
return RequiredFeatures;
}
// Emplaces an action of the specified Kind at the end of the action list.
//
// Returns a reference to the newly created action.
//
// Like std::vector::emplace_back(), may invalidate all iterators if the new
// size exceeds the capacity. Otherwise, only invalidates the past-the-end
// iterator.
template <class Kind, class... Args>
Kind &RuleMatcher::addAction(Args &&... args) {
Actions.emplace_back(llvm::make_unique<Kind>(std::forward<Args>(args)...));
return *static_cast<Kind *>(Actions.back().get());
}
// Emplaces an action of the specified Kind before the given insertion point.
//
// Returns an iterator pointing at the newly created instruction.
//
// Like std::vector::insert(), may invalidate all iterators if the new size
// exceeds the capacity. Otherwise, only invalidates the iterators from the
// insertion point onwards.
template <class Kind, class... Args>
const_action_iterator RuleMatcher::insertAction(const_action_iterator InsertPt,
Args &&... args) {
return Actions.insert(InsertPt, llvm::make_unique<Kind>(std::forward<Args>(args)...));
}
unsigned
RuleMatcher::implicitlyDefineInsnVar(const InstructionMatcher &Matcher) {
@ -2260,16 +2225,13 @@ private:
Expected<BuildMIAction &>
createAndImportInstructionRenderer(RuleMatcher &M,
const TreePatternNode *Dst);
Expected<const_action_iterator>
createInstructionRenderer(const_action_iterator InsertPt, RuleMatcher &M,
const TreePatternNode *Dst);
Expected<BuildMIAction &>
createInstructionRenderer(RuleMatcher &M, const TreePatternNode *Dst);
void importExplicitDefRenderers(BuildMIAction &DstMIBuilder);
Expected<const_action_iterator>
importExplicitUseRenderers(const_action_iterator InsertPt, RuleMatcher &M,
BuildMIAction &DstMIBuilder,
Expected<BuildMIAction &>
importExplicitUseRenderers(RuleMatcher &M, BuildMIAction &DstMIBuilder,
const llvm::TreePatternNode *Dst);
Expected<const_action_iterator>
importExplicitUseRenderer(const_action_iterator InsertPt, RuleMatcher &Rule,
Error importExplicitUseRenderer(RuleMatcher &Rule,
BuildMIAction &DstMIBuilder,
TreePatternNode *DstChild) const;
Error importDefaultOperandRenderers(BuildMIAction &DstMIBuilder,
@ -2601,9 +2563,9 @@ Error GlobalISelEmitter::importChildMatcher(RuleMatcher &Rule,
return failedImport("Src pattern child is an unsupported kind");
}
Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
const_action_iterator InsertPt, RuleMatcher &Rule,
BuildMIAction &DstMIBuilder, TreePatternNode *DstChild) const {
Error GlobalISelEmitter::importExplicitUseRenderer(
RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
TreePatternNode *DstChild) const {
if (DstChild->getTransformFn() != nullptr) {
return failedImport("Dst pattern child has transform fn " +
DstChild->getTransformFn()->getName());
@ -2614,7 +2576,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
0, *std::get<0>(*SubOperand), DstChild->getName(),
std::get<1>(*SubOperand), std::get<2>(*SubOperand));
return InsertPt;
return Error::success();
}
if (!DstChild->isLeaf()) {
@ -2624,7 +2586,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
auto &ChildSDNI = CGP.getSDNodeInfo(DstChild->getOperator());
if (ChildSDNI.getSDClassName() == "BasicBlockSDNode") {
DstMIBuilder.addRenderer<CopyRenderer>(0, DstChild->getName());
return InsertPt;
return Error::success();
}
}
@ -2635,11 +2597,11 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
if (DstChild->getOperator()->getName() == "imm") {
DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(0,
DstChild->getName());
return InsertPt;
return Error::success();
} else if (DstChild->getOperator()->getName() == "fpimm") {
DstMIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(
0, DstChild->getName());
return InsertPt;
return Error::success();
}
return failedImport("Dst pattern child isn't a leaf node or an MBB" + llvm::to_string(*DstChild));
@ -2661,7 +2623,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
if (ChildRec->isSubClassOf("Register")) {
DstMIBuilder.addRenderer<AddRegisterRenderer>(0, ChildRec);
return InsertPt;
return Error::success();
}
if (ChildRec->isSubClassOf("RegisterClass") ||
@ -2671,11 +2633,11 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
!ChildRec->isValueUnset("GIZeroRegister")) {
DstMIBuilder.addRenderer<CopyOrAddZeroRegRenderer>(
0, DstChild->getName(), ChildRec->getValueAsDef("GIZeroRegister"));
return InsertPt;
return Error::success();
}
DstMIBuilder.addRenderer<CopyRenderer>(0, DstChild->getName());
return InsertPt;
return Error::success();
}
if (ChildRec->isSubClassOf("ComplexPattern")) {
@ -2688,7 +2650,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
0, *ComplexPattern->second, DstChild->getName(),
OM.getAllocatedTemporariesBaseID());
return InsertPt;
return Error::success();
}
if (ChildRec->isSubClassOf("SDNodeXForm"))
@ -2704,26 +2666,22 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
RuleMatcher &M, const TreePatternNode *Dst) {
auto InsertPtOrError = createInstructionRenderer(M.actions_end(), M, Dst);
if (auto Error = InsertPtOrError.takeError())
auto DstMIBuilderOrError = createInstructionRenderer(M, Dst);
if (auto Error = DstMIBuilderOrError.takeError())
return std::move(Error);
const_action_iterator InsertPt = InsertPtOrError.get();
BuildMIAction &DstMIBuilder = *static_cast<BuildMIAction *>(InsertPt->get());
BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get();
importExplicitDefRenderers(DstMIBuilder);
if (auto Error = importExplicitUseRenderers(InsertPt, M, DstMIBuilder, Dst)
.takeError())
if (auto Error = importExplicitUseRenderers(M, DstMIBuilder, Dst).takeError())
return std::move(Error);
return DstMIBuilder;
}
Expected<const_action_iterator>
GlobalISelEmitter::createInstructionRenderer(const_action_iterator InsertPt,
RuleMatcher &M,
const TreePatternNode *Dst) {
Expected<BuildMIAction &> GlobalISelEmitter::createInstructionRenderer(
RuleMatcher &M, const TreePatternNode *Dst) {
Record *DstOp = Dst->getOperator();
if (!DstOp->isSubClassOf("Instruction")) {
if (DstOp->isSubClassOf("ValueType"))
@ -2740,9 +2698,9 @@ GlobalISelEmitter::createInstructionRenderer(const_action_iterator InsertPt,
else if (DstI->TheDef->getName() == "EXTRACT_SUBREG")
DstI = &Target.getInstruction(RK.getDef("COPY"));
InsertPt = M.insertAction<BuildMIAction>(InsertPt, 0, DstI);
auto &DstMIBuilder = M.addAction<BuildMIAction>(0, DstI);
return InsertPt;
return DstMIBuilder;
}
void GlobalISelEmitter::importExplicitDefRenderers(
@ -2754,8 +2712,8 @@ void GlobalISelEmitter::importExplicitDefRenderers(
}
}
Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
const_action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
Expected<BuildMIAction &> GlobalISelEmitter::importExplicitUseRenderers(
RuleMatcher &M, BuildMIAction &DstMIBuilder,
const llvm::TreePatternNode *Dst) {
const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
CodeGenInstruction *OrigDstI = &Target.getInstruction(Dst->getOperator());
@ -2781,7 +2739,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
DstMIBuilder.addRenderer<CopySubRegRenderer>(
0, Dst->getChild(0)->getName(), SubIdx);
return InsertPt;
return DstMIBuilder;
}
return failedImport("EXTRACT_SUBREG child #1 is not a subreg index");
@ -2814,11 +2772,9 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
continue;
}
auto InsertPtOrError = importExplicitUseRenderer(InsertPt, M, DstMIBuilder,
Dst->getChild(Child));
if (auto Error = InsertPtOrError.takeError())
if (auto Error =
importExplicitUseRenderer(M, DstMIBuilder, Dst->getChild(Child)))
return std::move(Error);
InsertPt = InsertPtOrError.get();
++Child;
}
@ -2829,7 +2785,7 @@ Expected<const_action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
" explicit ones and " + llvm::to_string(NumDefaultOps) +
" default ones");
return InsertPt;
return DstMIBuilder;
}
Error GlobalISelEmitter::importDefaultOperandRenderers(