mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
[globalisel][tablegen] Import rules containing intrinsic_wo_chain.
Summary: As of this patch, 1018 out of 3938 rules are currently imported. Depends on D32275 Reviewers: qcolombet, kristof.beyls, rovka, t.p.northover, ab, aditya_nandakumar Reviewed By: qcolombet Subscribers: dberris, igorb, llvm-commits Differential Revision: https://reviews.llvm.org/D32278 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303259 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c5e816b1b1
commit
4980b7679c
@ -62,6 +62,7 @@ def : GINodeEquiv<G_FMUL, fmul>;
|
|||||||
def : GINodeEquiv<G_FDIV, fdiv>;
|
def : GINodeEquiv<G_FDIV, fdiv>;
|
||||||
def : GINodeEquiv<G_FREM, frem>;
|
def : GINodeEquiv<G_FREM, frem>;
|
||||||
def : GINodeEquiv<G_FPOW, fpow>;
|
def : GINodeEquiv<G_FPOW, fpow>;
|
||||||
|
def : GINodeEquiv<G_INTRINSIC, intrinsic_wo_chain>;
|
||||||
def : GINodeEquiv<G_BR, br>;
|
def : GINodeEquiv<G_BR, br>;
|
||||||
|
|
||||||
// Specifies the GlobalISel equivalents for SelectionDAG's ComplexPattern.
|
// Specifies the GlobalISel equivalents for SelectionDAG's ComplexPattern.
|
||||||
|
@ -7,6 +7,10 @@ include "llvm/Target/Target.td"
|
|||||||
def MyTargetISA : InstrInfo;
|
def MyTargetISA : InstrInfo;
|
||||||
def MyTarget : Target { let InstructionSet = MyTargetISA; }
|
def MyTarget : Target { let InstructionSet = MyTargetISA; }
|
||||||
|
|
||||||
|
let TargetPrefix = "mytarget" in {
|
||||||
|
def int_mytarget_nop : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
|
||||||
|
}
|
||||||
|
|
||||||
def R0 : Register<"r0"> { let Namespace = "MyTarget"; }
|
def R0 : Register<"r0"> { let Namespace = "MyTarget"; }
|
||||||
def GPR32 : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
|
def GPR32 : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
|
||||||
def GPR32Op : RegisterOperand<GPR32>;
|
def GPR32Op : RegisterOperand<GPR32>;
|
||||||
@ -127,6 +131,37 @@ def : Pat<(select GPR32:$src1, complex:$src2, complex:$src3),
|
|||||||
def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2),
|
def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2),
|
||||||
[(set GPR32:$dst, (add GPR32:$src1, GPR32:$src2))]>;
|
[(set GPR32:$dst, (add GPR32:$src1, GPR32:$src2))]>;
|
||||||
|
|
||||||
|
//===- Test a simple pattern with an intrinsic. ---------------------------===//
|
||||||
|
//
|
||||||
|
|
||||||
|
// CHECK-LABEL: if ([&]() {
|
||||||
|
// CHECK-NEXT: MachineInstr &MI0 = I;
|
||||||
|
// CHECK-NEXT: if (MI0.getNumOperands() < 3)
|
||||||
|
// CHECK-NEXT: return false;
|
||||||
|
// CHECK-NEXT: if ((MI0.getOpcode() == TargetOpcode::G_INTRINSIC) &&
|
||||||
|
// CHECK-NEXT: ((/* dst */ (MRI.getType(MI0.getOperand(0).getReg()) == (LLT::scalar(32))) &&
|
||||||
|
// CHECK-NEXT: ((&RBI.getRegBankFromRegClass(MyTarget::GPR32RegClass) == RBI.getRegBank(MI0.getOperand(0).getReg(), MRI, TRI))))) &&
|
||||||
|
// CHECK-NEXT: ((/* Operand 1 */ (isOperandImmEqual(MI0.getOperand(1), [[ID:[0-9]+]], MRI)))) &&
|
||||||
|
// CHECK-NEXT: ((/* src1 */ (MRI.getType(MI0.getOperand(2).getReg()) == (LLT::scalar(32))) &&
|
||||||
|
// CHECK-NEXT: ((&RBI.getRegBankFromRegClass(MyTarget::GPR32RegClass) == RBI.getRegBank(MI0.getOperand(2).getReg(), MRI, TRI)))))) {
|
||||||
|
// CHECK-NEXT: // (intrinsic_wo_chain:i32 [[ID]]:iPTR, GPR32:i32:$src1) => (MOV:i32 GPR32:i32:$src1)
|
||||||
|
// CHECK-NEXT: MachineInstrBuilder MIB = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(MyTarget::MOV));
|
||||||
|
// CHECK-NEXT: MIB.add(MI0.getOperand(0)/*dst*/);
|
||||||
|
// CHECK-NEXT: MIB.add(MI0.getOperand(2)/*src1*/);
|
||||||
|
// CHECK-NEXT: for (const auto *FromMI : {&MI0, })
|
||||||
|
// CHECK-NEXT: for (const auto &MMO : FromMI->memoperands())
|
||||||
|
// CHECK-NEXT: MIB.addMemOperand(MMO);
|
||||||
|
// CHECK-NEXT: I.eraseFromParent();
|
||||||
|
// CHECK-NEXT: MachineInstr &NewI = *MIB;
|
||||||
|
// CHECK-NEXT: constrainSelectedInstRegOperands(NewI, TII, TRI, RBI);
|
||||||
|
// CHECK-NEXT: return true;
|
||||||
|
// CHECK-NEXT: }
|
||||||
|
// CHECK-NEXT: return false;
|
||||||
|
// CHECK-NEXT: }()) { return true; }
|
||||||
|
|
||||||
|
def MOV : I<(outs GPR32:$dst), (ins GPR32:$src1),
|
||||||
|
[(set GPR32:$dst, (int_mytarget_nop GPR32:$src1))]>;
|
||||||
|
|
||||||
//===- Test a nested instruction match. -----------------------------------===//
|
//===- Test a nested instruction match. -----------------------------------===//
|
||||||
|
|
||||||
// CHECK-LABEL: if ([&]() {
|
// CHECK-LABEL: if ([&]() {
|
||||||
|
@ -1325,8 +1325,27 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
|
|||||||
|
|
||||||
// Match the used operands (i.e. the children of the operator).
|
// Match the used operands (i.e. the children of the operator).
|
||||||
for (unsigned i = 0, e = Src->getNumChildren(); i != e; ++i) {
|
for (unsigned i = 0, e = Src->getNumChildren(); i != e; ++i) {
|
||||||
if (auto Error = importChildMatcher(InsnMatcher, Src->getChild(i), OpIdx++,
|
TreePatternNode *SrcChild = Src->getChild(i);
|
||||||
TempOpIdx))
|
|
||||||
|
// For G_INTRINSIC, the operand immediately following the defs is an
|
||||||
|
// intrinsic ID.
|
||||||
|
if (SrcGI.TheDef->getName() == "G_INTRINSIC" && i == 0) {
|
||||||
|
if (!SrcChild->isLeaf())
|
||||||
|
return failedImport("Expected IntInit containing intrinsic ID");
|
||||||
|
|
||||||
|
if (IntInit *SrcChildIntInit =
|
||||||
|
dyn_cast<IntInit>(SrcChild->getLeafValue())) {
|
||||||
|
OperandMatcher &OM =
|
||||||
|
InsnMatcher.addOperand(OpIdx++, SrcChild->getName(), TempOpIdx);
|
||||||
|
OM.addPredicate<IntOperandMatcher>(SrcChildIntInit->getValue());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return failedImport("Expected IntInit containing instrinsic ID)");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto Error =
|
||||||
|
importChildMatcher(InsnMatcher, SrcChild, OpIdx++, TempOpIdx))
|
||||||
return std::move(Error);
|
return std::move(Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1361,7 +1380,7 @@ Error GlobalISelEmitter::importChildMatcher(InstructionMatcher &InsnMatcher,
|
|||||||
|
|
||||||
auto OpTyOrNone = MVTToLLT(ChildTypes.front().getConcrete());
|
auto OpTyOrNone = MVTToLLT(ChildTypes.front().getConcrete());
|
||||||
if (!OpTyOrNone)
|
if (!OpTyOrNone)
|
||||||
return failedImport("Src operand has an unsupported type");
|
return failedImport("Src operand has an unsupported type (" + to_string(*SrcChild) + ")");
|
||||||
OM.addPredicate<LLTOperandMatcher>(*OpTyOrNone);
|
OM.addPredicate<LLTOperandMatcher>(*OpTyOrNone);
|
||||||
|
|
||||||
// Check for nested instructions.
|
// Check for nested instructions.
|
||||||
|
Loading…
Reference in New Issue
Block a user