[llvm] r315866 - Revert r315863: [globalisel][tablegen] Import ComplexPattern when used as an operator
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 15 10:51:07 PDT 2017
Author: dsanders
Date: Sun Oct 15 10:51:07 2017
New Revision: 315866
URL: http://llvm.org/viewvc/llvm-project?rev=315866&view=rev
Log:
Revert r315863: [globalisel][tablegen] Import ComplexPattern when used as an operator
A large number of bots are failing on an ambiguous constructor call.
Modified:
llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h
llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp
llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp
llvm/trunk/test/TableGen/GlobalISelEmitter.td
llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h Sun Oct 15 10:51:07 2017
@@ -17,7 +17,6 @@
#define LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/Optional.h"
#include <bitset>
#include <cstddef>
#include <cstdint>
@@ -208,11 +207,6 @@ enum {
/// - InsnID - Instruction ID to modify
/// - RendererID - The renderer to call
GIR_ComplexRenderer,
- /// Render sub-operands of complex operands to the specified instruction
- /// - InsnID - Instruction ID to modify
- /// - RendererID - The renderer to call
- /// - RenderOpID - The suboperand to render.
- GIR_ComplexSubOperandRenderer,
/// Render a G_CONSTANT operator as a sign-extended immediate.
/// - NewInsnID - Instruction ID to modify
@@ -271,13 +265,12 @@ public:
virtual bool select(MachineInstr &I) const = 0;
protected:
- using ComplexRendererFn =
- Optional<SmallVector<std::function<void(MachineInstrBuilder &)>, 4>>;
+ using ComplexRendererFn = std::function<void(MachineInstrBuilder &)>;
using RecordedMIVector = SmallVector<MachineInstr *, 4>;
using NewMIVector = SmallVector<MachineInstrBuilder, 4>;
struct MatcherState {
- std::vector<ComplexRendererFn::value_type> Renderers;
+ std::vector<ComplexRendererFn> Renderers;
RecordedMIVector MIs;
MatcherState(unsigned MaxRenderers);
Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h Sun Oct 15 10:51:07 2017
@@ -273,14 +273,12 @@ bool InstructionSelector::executeMatchTa
<< "), ComplexPredicateID=" << ComplexPredicateID << ")\n");
assert(State.MIs[InsnID] != nullptr && "Used insn before defined");
// FIXME: Use std::invoke() when it's available.
- ComplexRendererFn Renderer =
- (ISel.*MatcherInfo.ComplexPredicates[ComplexPredicateID])(
- State.MIs[InsnID]->getOperand(OpIdx));
- if (Renderer.hasValue())
- State.Renderers[RendererID] = Renderer.getValue();
- else
+ if (!(State.Renderers[RendererID] =
+ (ISel.*MatcherInfo.ComplexPredicates[ComplexPredicateID])(
+ State.MIs[InsnID]->getOperand(OpIdx)))) {
if (handleReject() == RejectAndGiveUp)
return false;
+ }
break;
}
@@ -474,23 +472,11 @@ bool InstructionSelector::executeMatchTa
int64_t InsnID = MatchTable[CurrentIdx++];
int64_t RendererID = MatchTable[CurrentIdx++];
assert(OutMIs[InsnID] && "Attempted to add to undefined instruction");
- for (const auto &RenderOpFn : State.Renderers[RendererID])
- RenderOpFn(OutMIs[InsnID]);
+ State.Renderers[RendererID](OutMIs[InsnID]);
DEBUG(dbgs() << CurrentIdx << ": GIR_ComplexRenderer(OutMIs[" << InsnID
<< "], " << RendererID << ")\n");
break;
}
- case GIR_ComplexSubOperandRenderer: {
- int64_t InsnID = MatchTable[CurrentIdx++];
- int64_t RendererID = MatchTable[CurrentIdx++];
- int64_t RenderOpID = MatchTable[CurrentIdx++];
- assert(OutMIs[InsnID] && "Attempted to add to undefined instruction");
- State.Renderers[RendererID][RenderOpID](OutMIs[InsnID]);
- DEBUG(dbgs() << CurrentIdx << ": GIR_ComplexSubOperandRenderer(OutMIs["
- << InsnID << "], " << RendererID << ", " << RenderOpID
- << ")\n");
- break;
- }
case GIR_CopyConstantAsSImm: {
int64_t NewInsnID = MatchTable[CurrentIdx++];
Modified: llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp Sun Oct 15 10:51:07 2017
@@ -29,7 +29,7 @@
using namespace llvm;
InstructionSelector::MatcherState::MatcherState(unsigned MaxRenderers)
- : Renderers(MaxRenderers, {}), MIs() {}
+ : Renderers(MaxRenderers, nullptr), MIs() {}
InstructionSelector::InstructionSelector() = default;
Modified: llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp Sun Oct 15 10:51:07 2017
@@ -1367,13 +1367,13 @@ AArch64InstructionSelector::selectArithI
else if (Root.isReg()) {
MachineInstr *Def = MRI.getVRegDef(Root.getReg());
if (Def->getOpcode() != TargetOpcode::G_CONSTANT)
- return None;
+ return nullptr;
MachineOperand &Op1 = Def->getOperand(1);
if (!Op1.isCImm() || Op1.getCImm()->getBitWidth() > 64)
- return None;
+ return nullptr;
Immed = Op1.getCImm()->getZExtValue();
} else
- return None;
+ return nullptr;
unsigned ShiftAmt;
@@ -1383,13 +1383,10 @@ AArch64InstructionSelector::selectArithI
ShiftAmt = 12;
Immed = Immed >> 12;
} else
- return None;
+ return nullptr;
unsigned ShVal = AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftAmt);
- return {{
- [=](MachineInstrBuilder &MIB) { MIB.addImm(Immed); },
- [=](MachineInstrBuilder &MIB) { MIB.addImm(ShVal); },
- }};
+ return [=](MachineInstrBuilder &MIB) { MIB.addImm(Immed).addImm(ShVal); };
}
namespace llvm {
Modified: llvm/trunk/test/TableGen/GlobalISelEmitter.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/GlobalISelEmitter.td?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/test/TableGen/GlobalISelEmitter.td (original)
+++ llvm/trunk/test/TableGen/GlobalISelEmitter.td Sun Oct 15 10:51:07 2017
@@ -31,12 +31,6 @@ def complex : Operand<i32>, ComplexPatte
def gi_complex :
GIComplexOperandMatcher<s32, "selectComplexPattern">,
GIComplexPatternEquiv<complex>;
-def complex_rr : Operand<i32>, ComplexPattern<i32, 2, "SelectComplexPatternRR", []> {
- let MIOperandInfo = (ops GPR32, GPR32);
-}
-def gi_complex_rr :
- GIComplexOperandMatcher<s32, "selectComplexPatternRR">,
- GIComplexPatternEquiv<complex_rr>;
def m1 : OperandWithDefaultOps <i32, (ops (i32 -1))>;
def Z : OperandWithDefaultOps <i32, (ops R0)>;
@@ -62,7 +56,6 @@ def HasC : Predicate<"Subtarget->hasC()"
// CHECK-NEXT: MatcherInfo({TypeObjects, FeatureBitsets, I64ImmPredicateFns, APIntImmPredicateFns, APFloatImmPredicateFns, {
// CHECK-NEXT: nullptr, // GICP_Invalid
// CHECK-NEXT: &MyTargetInstructionSelector::selectComplexPattern, // gi_complex
-// CHECK-NEXT: &MyTargetInstructionSelector::selectComplexPatternRR, // gi_complex_rr
// CHECK-NEXT: }})
// CHECK-NEXT: #endif // ifdef GET_GLOBALISEL_TEMPORARIES_INIT
@@ -114,7 +107,6 @@ def HasC : Predicate<"Subtarget->hasC()"
// CHECK-NEXT: enum {
// CHECK-NEXT: GICP_Invalid,
// CHECK-NEXT: GICP_gi_complex,
-// CHECK-NEXT: GICP_gi_complex_rr,
// CHECK-NEXT: };
// CHECK-LABEL: // PatFrag predicates.
@@ -188,13 +180,9 @@ def HasC : Predicate<"Subtarget->hasC()"
// CHECK-NEXT: // Label 0: @[[LABEL]]
def INSN3 : I<(outs GPR32:$dst),
- (ins GPR32Op:$src1, GPR32:$src2a, GPR32:$src2b, GPR32:$src3, complex:$src4, i32imm:$src5a, i32imm:$src5b), []>;
-def : Pat<(select GPR32:$src1, (complex_rr GPR32:$src2a, GPR32:$src2b),
- (select GPR32:$src3,
- complex:$src4,
- (complex i32imm:$src5a, i32imm:$src5b))),
- (INSN3 GPR32:$src1, GPR32:$src2b, GPR32:$src2a, GPR32:$src3,
- complex:$src4, i32imm:$src5a, i32imm:$src5b)>;
+ (ins GPR32Op:$src1, complex:$src2, GPR32:$src3, complex:$src4, complex:$src5), []>;
+def : Pat<(select GPR32:$src1, complex:$src2, (select GPR32:$src3, complex:$src4, complex:$src5)),
+ (INSN3 GPR32:$src1, complex:$src2, GPR32:$src3, complex:$src4, complex:$src5)>;
//===- Test a pattern with multiple ComplexPattern operands. --------------===//
//
@@ -210,9 +198,9 @@ def : Pat<(select GPR32:$src1, (complex_
// CHECK-NEXT: // MIs[0] src1
// CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/1, /*Type*/GILLT_s32,
// CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/0, /*Op*/1, /*RC*/MyTarget::GPR32RegClassID,
-// CHECK-NEXT: // MIs[0] Operand 2
+// CHECK-NEXT: // MIs[0] src2
// CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/2, /*Type*/GILLT_s32,
-// CHECK-NEXT: GIM_CheckComplexPattern, /*MI*/0, /*Op*/2, /*Renderer*/0, GICP_gi_complex_rr,
+// CHECK-NEXT: GIM_CheckComplexPattern, /*MI*/0, /*Op*/2, /*Renderer*/0, GICP_gi_complex,
// CHECK-NEXT: // MIs[0] Operand 3
// CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/3, /*Type*/GILLT_s32,
// CHECK-NEXT: GIM_CheckOpcode, /*MI*/1, TargetOpcode::G_SELECT,
@@ -224,20 +212,18 @@ def : Pat<(select GPR32:$src1, (complex_
// CHECK-NEXT: // MIs[1] src4
// CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,
// CHECK-NEXT: GIM_CheckComplexPattern, /*MI*/1, /*Op*/2, /*Renderer*/1, GICP_gi_complex,
-// CHECK-NEXT: // MIs[1] Operand 3
+// CHECK-NEXT: // MIs[1] src5
// CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/3, /*Type*/GILLT_s32,
// CHECK-NEXT: GIM_CheckComplexPattern, /*MI*/1, /*Op*/3, /*Renderer*/2, GICP_gi_complex,
// CHECK-NEXT: GIM_CheckIsSafeToFold, /*InsnID*/1,
-// CHECK-NEXT: // (select:{ *:[i32] } GPR32:{ *:[i32] }:$src1, (complex_rr:{ *:[i32] } GPR32:{ *:[i32] }:$src2a, GPR32:{ *:[i32] }:$src2b), (select:{ *:[i32] } GPR32:{ *:[i32] }:$src3, complex:{ *:[i32] }:$src4, (complex:{ *:[i32] } i32imm:{ *:[i32] }:$src5a, i32imm:{ *:[i32] }:$src5b))) => (INSN3:{ *:[i32] } GPR32:{ *:[i32] }:$src1, GPR32:{ *:[i32] }:$src2b, GPR32:{ *:[i32] }:$src2a, GPR32:{ *:[i32] }:$src3, complex:{ *:[i32] }:$src4, i32imm:{ *:[i32] }:$src5a, i32imm:{ *:[i32] }:$src5b)
+// CHECK-NEXT: // (select:{ *:[i32] } GPR32:{ *:[i32] }:$src1, complex:{ *:[i32] }:$src2, (select:{ *:[i32] } GPR32:{ *:[i32] }:$src3, complex:{ *:[i32] }:$src4, complex:{ *:[i32] }:$src5)) => (INSN3:{ *:[i32] } GPR32:{ *:[i32] }:$src1, complex:{ *:[i32] }:$src2, GPR32:{ *:[i32] }:$src3, complex:{ *:[i32] }:$src4, complex:{ *:[i32] }:$src5)
// CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::INSN3,
// CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
// CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/1, // src1
-// CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // src2b
-// CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src2a
+// CHECK-NEXT: GIR_ComplexRenderer, /*InsnID*/0, /*RendererID*/0,
// CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/1, /*OpIdx*/1, // src3
// CHECK-NEXT: GIR_ComplexRenderer, /*InsnID*/0, /*RendererID*/1,
-// CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/2, /*SubOperand*/0, // src5a
-// CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/2, /*SubOperand*/1, // src5b
+// CHECK-NEXT: GIR_ComplexRenderer, /*InsnID*/0, /*RendererID*/2,
// CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
// CHECK-NEXT: GIR_ConstrainSelectedInstOperands, /*InsnID*/0,
// CHECK-NEXT: GIR_Done,
Modified: llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp?rev=315866&r1=315865&r2=315866&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp Sun Oct 15 10:51:07 2017
@@ -203,12 +203,7 @@ std::string explainOperator(Record *Oper
if (Operator->isSubClassOf("Intrinsic"))
return (" (Operator is an Intrinsic, " + Operator->getName() + ")").str();
- if (Operator->isSubClassOf("ComplexPattern"))
- return (" (Operator is an unmapped ComplexPattern, " + Operator->getName() +
- ")")
- .str();
-
- return (" (Operator " + Operator->getName() + " not understood)").str();
+ return " (Operator not understood)";
}
/// Helper function to let the emitter report skip reason error messages.
@@ -519,17 +514,10 @@ class RuleMatcher {
ArrayRef<SMLoc> SrcLoc;
- typedef std::tuple<Record *, unsigned, unsigned>
- DefinedComplexPatternSubOperand;
- typedef StringMap<DefinedComplexPatternSubOperand>
- DefinedComplexPatternSubOperandMap;
- /// A map of Symbolic Names to ComplexPattern sub-operands.
- DefinedComplexPatternSubOperandMap ComplexSubOperands;
-
public:
RuleMatcher(ArrayRef<SMLoc> SrcLoc)
: Matchers(), Actions(), InsnVariableIDs(), DefinedOperands(),
- NextInsnVarID(0), SrcLoc(SrcLoc), ComplexSubOperands() {}
+ NextInsnVarID(0), SrcLoc(SrcLoc) {}
RuleMatcher(RuleMatcher &&Other) = default;
RuleMatcher &operator=(RuleMatcher &&Other) = default;
@@ -559,20 +547,6 @@ public:
void defineOperand(StringRef SymbolicName, OperandMatcher &OM);
- void defineComplexSubOperand(StringRef SymbolicName, Record *ComplexPattern,
- unsigned RendererID, unsigned SubOperandID) {
- assert(ComplexSubOperands.count(SymbolicName) == 0 && "Already defined");
- ComplexSubOperands[SymbolicName] =
- std::make_tuple(ComplexPattern, RendererID, SubOperandID);
- }
- Optional<DefinedComplexPatternSubOperand>
- getComplexSubOperand(StringRef SymbolicName) const {
- const auto &I = ComplexSubOperands.find(SymbolicName);
- if (I == ComplexSubOperands.end())
- return None;
- return I->second;
- }
-
const InstructionMatcher &getInstructionMatcher(StringRef SymbolicName) const;
const OperandMatcher &getOperandMatcher(StringRef Name) const;
@@ -1566,9 +1540,6 @@ private:
/// The renderer number. This must be unique within a rule since it's used to
/// identify a temporary variable to hold the renderer function.
unsigned RendererID;
- /// When provided, this is the suboperand of the ComplexPattern operand to
- /// render. Otherwise all the suboperands will be rendered.
- Optional<unsigned> SubOperand;
unsigned getNumOperands() const {
return TheDef.getValueAsDag("Operands")->getNumArgs();
@@ -1576,26 +1547,19 @@ private:
public:
RenderComplexPatternOperand(unsigned InsnID, const Record &TheDef,
- StringRef SymbolicName, unsigned RendererID,
- Optional<unsigned> SubOperand = None)
+ StringRef SymbolicName, unsigned RendererID)
: OperandRenderer(OR_ComplexPattern), InsnID(InsnID), TheDef(TheDef),
- SymbolicName(SymbolicName), RendererID(RendererID),
- SubOperand(SubOperand) {}
+ SymbolicName(SymbolicName), RendererID(RendererID) {}
static bool classof(const OperandRenderer *R) {
return R->getKind() == OR_ComplexPattern;
}
void emitRenderOpcodes(MatchTable &Table, RuleMatcher &Rule) const override {
- Table << MatchTable::Opcode(SubOperand.hasValue() ? "GIR_ComplexSubOperandRenderer"
- : "GIR_ComplexRenderer")
+ Table << MatchTable::Opcode("GIR_ComplexRenderer")
<< MatchTable::Comment("InsnID") << MatchTable::IntValue(InsnID)
<< MatchTable::Comment("RendererID")
- << MatchTable::IntValue(RendererID);
- if (SubOperand.hasValue())
- Table << MatchTable::Comment("SubOperand")
- << MatchTable::IntValue(SubOperand.getValue());
- Table << MatchTable::Comment(SymbolicName) << MatchTable::LineBreak;
+ << MatchTable::IntValue(RendererID) << MatchTable::LineBreak;
}
};
@@ -2064,12 +2028,11 @@ private:
Record *findNodeEquiv(Record *N) const;
Error importRulePredicates(RuleMatcher &M, ArrayRef<Predicate> Predicates);
- Expected<InstructionMatcher &> createAndImportSelDAGMatcher(
- RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
- const TreePatternNode *Src, unsigned &TempOpIdx) const;
- Error importComplexPatternOperandMatcher(OperandMatcher &OM, Record *R,
- unsigned &TempOpIdx) const;
- Error importChildMatcher(RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
+ Expected<InstructionMatcher &>
+ createAndImportSelDAGMatcher(InstructionMatcher &InsnMatcher,
+ const TreePatternNode *Src,
+ unsigned &TempOpIdx) const;
+ Error importChildMatcher(InstructionMatcher &InsnMatcher,
const TreePatternNode *SrcChild, unsigned OpIdx,
unsigned &TempOpIdx) const;
Expected<BuildMIAction &>
@@ -2133,9 +2096,10 @@ GlobalISelEmitter::importRulePredicates(
return Error::success();
}
-Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
- RuleMatcher &Rule, InstructionMatcher &InsnMatcher,
- const TreePatternNode *Src, unsigned &TempOpIdx) const {
+Expected<InstructionMatcher &>
+GlobalISelEmitter::createAndImportSelDAGMatcher(InstructionMatcher &InsnMatcher,
+ const TreePatternNode *Src,
+ unsigned &TempOpIdx) const {
Record *SrcGIEquivOrNull = nullptr;
const CodeGenInstruction *SrcGIOrNull = nullptr;
@@ -2232,8 +2196,8 @@ Expected<InstructionMatcher &> GlobalISe
return failedImport("Expected IntInit containing instrinsic ID)");
}
- if (auto Error = importChildMatcher(Rule, InsnMatcher, SrcChild, OpIdx++,
- TempOpIdx))
+ if (auto Error =
+ importChildMatcher(InsnMatcher, SrcChild, OpIdx++, TempOpIdx))
return std::move(Error);
}
}
@@ -2241,20 +2205,7 @@ Expected<InstructionMatcher &> GlobalISe
return InsnMatcher;
}
-Error GlobalISelEmitter::importComplexPatternOperandMatcher(
- OperandMatcher &OM, Record *R, unsigned &TempOpIdx) const {
- const auto &ComplexPattern = ComplexPatternEquivs.find(R);
- if (ComplexPattern == ComplexPatternEquivs.end())
- return failedImport("SelectionDAG ComplexPattern (" + R->getName() +
- ") not mapped to GlobalISel");
-
- OM.addPredicate<ComplexPatternOperandMatcher>(OM, *ComplexPattern->second);
- TempOpIdx++;
- return Error::success();
-}
-
-Error GlobalISelEmitter::importChildMatcher(RuleMatcher &Rule,
- InstructionMatcher &InsnMatcher,
+Error GlobalISelEmitter::importChildMatcher(InstructionMatcher &InsnMatcher,
const TreePatternNode *SrcChild,
unsigned OpIdx,
unsigned &TempOpIdx) const {
@@ -2287,26 +2238,6 @@ Error GlobalISelEmitter::importChildMatc
// Check for nested instructions.
if (!SrcChild->isLeaf()) {
- if (SrcChild->getOperator()->isSubClassOf("ComplexPattern")) {
- // When a ComplexPattern is used as an operator, it should do the same
- // thing as when used as a leaf. However, the children of the operator
- // name the sub-operands that make up the complex operand and we must
- // prepare to reference them in the renderer too.
- unsigned RendererID = TempOpIdx;
- if (auto Error = importComplexPatternOperandMatcher(
- OM, SrcChild->getOperator(), TempOpIdx))
- return Error;
-
- for (unsigned i = 0, e = SrcChild->getNumChildren(); i != e; ++i) {
- auto *SubOperand = SrcChild->getChild(i);
- if (!SubOperand->getName().empty())
- Rule.defineComplexSubOperand(SubOperand->getName(),
- SrcChild->getOperator(), RendererID, i);
- }
-
- return Error::success();
- }
-
auto MaybeInsnOperand = OM.addPredicate<InstructionOperandMatcher>(
InsnMatcher.getRuleMatcher(), SrcChild->getName());
if (!MaybeInsnOperand.hasValue()) {
@@ -2319,7 +2250,7 @@ Error GlobalISelEmitter::importChildMatc
// Map the node to a gMIR instruction.
InstructionOperandMatcher &InsnOperand = **MaybeInsnOperand;
auto InsnMatcherOrError = createAndImportSelDAGMatcher(
- Rule, InsnOperand.getInsnMatcher(), SrcChild, TempOpIdx);
+ InsnOperand.getInsnMatcher(), SrcChild, TempOpIdx);
if (auto Error = InsnMatcherOrError.takeError())
return Error;
@@ -2352,8 +2283,17 @@ Error GlobalISelEmitter::importChildMatc
}
// Check for ComplexPattern's.
- if (ChildRec->isSubClassOf("ComplexPattern"))
- return importComplexPatternOperandMatcher(OM, ChildRec, TempOpIdx);
+ if (ChildRec->isSubClassOf("ComplexPattern")) {
+ const auto &ComplexPattern = ComplexPatternEquivs.find(ChildRec);
+ if (ComplexPattern == ComplexPatternEquivs.end())
+ return failedImport("SelectionDAG ComplexPattern (" +
+ ChildRec->getName() + ") not mapped to GlobalISel");
+
+ OM.addPredicate<ComplexPatternOperandMatcher>(OM,
+ *ComplexPattern->second);
+ TempOpIdx++;
+ return Error::success();
+ }
if (ChildRec->isSubClassOf("ImmLeaf")) {
return failedImport(
@@ -2375,14 +2315,6 @@ Error GlobalISelEmitter::importExplicitU
DstChild->getTransformFn()->getName());
}
- const auto &SubOperand = Rule.getComplexSubOperand(DstChild->getName());
- if (SubOperand.hasValue()) {
- DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
- 0, *std::get<0>(*SubOperand), DstChild->getName(),
- std::get<1>(*SubOperand), std::get<2>(*SubOperand));
- return Error::success();
- }
-
if (!DstChild->isLeaf()) {
// We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
// inline, but in MI it's just another operand.
@@ -2620,7 +2552,7 @@ Expected<RuleMatcher> GlobalISelEmitter:
InstructionMatcher &InsnMatcherTemp = M.addInstructionMatcher(Src->getName());
unsigned TempOpIdx = 0;
auto InsnMatcherOrError =
- createAndImportSelDAGMatcher(M, InsnMatcherTemp, Src, TempOpIdx);
+ createAndImportSelDAGMatcher(InsnMatcherTemp, Src, TempOpIdx);
if (auto Error = InsnMatcherOrError.takeError())
return std::move(Error);
InstructionMatcher &InsnMatcher = InsnMatcherOrError.get();
More information about the llvm-commits
mailing list