-
Notifications
You must be signed in to change notification settings - Fork 12.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[TableGen] Add a backend to generate MacroFusion predicators
`FusionPredicate` is used to predicate if target instruction matches the requirement. The targets can be firstMI, secondMI or both. The `Fusion` contains a list of `FusionPredicate`. The generated code will be like: ``` bool isNAME(const TargetInstrInfo &TII, const TargetSubtargetInfo &STI, const MachineInstr *FirstMI, const MachineInstr &SecondMI) { auto &MRI = SecondMI.getMF()->getRegInfo(); /* Predicates */ return true; } ``` A boilerplate class called `SimpleFusion` is added. `SimpleFusion` has a predefined structure of predicates and accepts predicate for `firstMI`, predicate for `secondMI` and epilog/prolog as arguments. The generated code for `SimpleFusion` will be like: ``` bool isNAME(const TargetInstrInfo &TII, const TargetSubtargetInfo &STI, const MachineInstr *FirstMI, const MachineInstr &SecondMI) { auto &MRI = SecondMI.getMF()->getRegInfo(); /* Prolog */ /* Predicate for `SecondMI` */ /* Wildcard */ /* Predicate for `FirstMI` */ /* Check One Use */ /* Tie registers */ /* Epilog */ return true; } ```
- Loading branch information
Showing
7 changed files
with
462 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
// RUN: llvm-tblgen -gen-macro-fusion-pred -I %p/../../include %s | FileCheck %s --check-prefix=CHECK-PREDICATOR | ||
|
||
include "llvm/Target/Target.td" | ||
|
||
def TestInstrInfo : InstrInfo { } | ||
def TestAsmWriter : AsmWriter { | ||
int PassSubtarget = 1; | ||
} | ||
|
||
def Test : Target { | ||
let InstructionSet = TestInstrInfo; | ||
let AssemblyWriters = [TestAsmWriter]; | ||
} | ||
|
||
let Namespace = "Test" in { | ||
foreach i = 0-32 in { | ||
def X#i : Register<"x"#i>; | ||
} | ||
|
||
def GPR : RegisterClass<"GPR", [i32], 32, (sequence "X%u", 0, 32)>; | ||
|
||
class TestInst<int Opc> : Instruction { | ||
field bits<32> Inst; | ||
field bits<32> SoftFail = 0; | ||
let Size = 4; | ||
let Inst = Opc; | ||
let OutOperandList = (outs); | ||
let InOperandList = (ins); | ||
let AsmString = NAME; | ||
} | ||
} | ||
|
||
def Inst0 : TestInst<0>; | ||
def Inst1 : TestInst<1>; | ||
|
||
def TestFusion: SimpleFusion<CheckOpcode<[Inst0]>, | ||
CheckAll<[ | ||
CheckOpcode<[Inst1]>, | ||
CheckRegOperand<0, X0> | ||
]>>; | ||
|
||
// CHECK-PREDICATOR: #ifdef GET_Test_MACRO_FUSION_PRED_DECL | ||
// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_DECL | ||
// CHECK-PREDICATOR-EMPTY: | ||
// CHECK-PREDICATOR-NEXT: namespace llvm { | ||
// CHECK-PREDICATOR-NEXT: bool isTestFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &); | ||
// CHECK-PREDICATOR-NEXT: } // end namespace llvm | ||
// CHECK-PREDICATOR-EMPTY: | ||
// CHECK-PREDICATOR-NEXT: #endif | ||
|
||
// CHECK-PREDICATOR: #ifdef GET_Test_MACRO_FUSION_PRED_IMPL | ||
// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_IMPL | ||
// CHECK-PREDICATOR-EMPTY: | ||
// CHECK-PREDICATOR-NEXT: namespace llvm { | ||
// CHECK-PREDICATOR-NEXT: bool isTestFusion( | ||
// CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII, | ||
// CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI, | ||
// CHECK-PREDICATOR-NEXT: const MachineInstr *FirstMI, | ||
// CHECK-PREDICATOR-NEXT: const MachineInstr &SecondMI) { | ||
// CHECK-PREDICATOR-NEXT: auto &MRI = SecondMI.getMF()->getRegInfo(); | ||
// CHECK-PREDICATOR-NEXT: { | ||
// CHECK-PREDICATOR-NEXT: const MachineInstr *MI = &SecondMI; | ||
// CHECK-PREDICATOR-NEXT: if (!( | ||
// CHECK-PREDICATOR-NEXT: ( MI->getOpcode() == Test::Inst1 ) | ||
// CHECK-PREDICATOR-NEXT: && MI->getOperand(0).getReg() == Test::X0 | ||
// CHECK-PREDICATOR-NEXT: )) | ||
// CHECK-PREDICATOR-NEXT: return false; | ||
// CHECK-PREDICATOR-NEXT: } | ||
// CHECK-PREDICATOR-NEXT: if (!FirstMI) | ||
// CHECK-PREDICATOR-NEXT: return true; | ||
// CHECK-PREDICATOR-NEXT: { | ||
// CHECK-PREDICATOR-NEXT: const MachineInstr *MI = FirstMI; | ||
// CHECK-PREDICATOR-NEXT: if (( MI->getOpcode() != Test::Inst0 )) | ||
// CHECK-PREDICATOR-NEXT: return false; | ||
// CHECK-PREDICATOR-NEXT: } | ||
// CHECK-PREDICATOR-NEXT: { | ||
// CHECK-PREDICATOR-NEXT: const MachineInstr *MI = &SecondMI; | ||
// CHECK-PREDICATOR-NEXT: if (!( | ||
// CHECK-PREDICATOR-NEXT: MI->getOperand(0).getReg().isVirtual() | ||
// CHECK-PREDICATOR-NEXT: || MI->getOperand(0).getReg() == MI->getOperand(1).getReg() | ||
// CHECK-PREDICATOR-NEXT: )) | ||
// CHECK-PREDICATOR-NEXT: return false; | ||
// CHECK-PREDICATOR-NEXT: } | ||
// CHECK-PREDICATOR-NEXT: { | ||
// CHECK-PREDICATOR-NEXT: Register FirstDest = FirstMI->getOperand(0).getReg(); | ||
// CHECK-PREDICATOR-NEXT: if (FirstDest.isVirtual() && !MRI.hasOneNonDBGUse(FirstDest)) | ||
// CHECK-PREDICATOR-NEXT: return false; | ||
// CHECK-PREDICATOR-NEXT: } | ||
// CHECK-PREDICATOR-NEXT: if (!(FirstMI->getOperand(0).isReg() && | ||
// CHECK-PREDICATOR-NEXT: SecondMI.getOperand(1).isReg() && | ||
// CHECK-PREDICATOR-NEXT: FirstMI->getOperand(0).getReg() == SecondMI.getOperand(1).getReg())) | ||
// CHECK-PREDICATOR-NEXT: return false; | ||
// CHECK-PREDICATOR-NEXT: return true; | ||
// CHECK-PREDICATOR-NEXT: } | ||
// CHECK-PREDICATOR-NEXT: } // end namespace llvm | ||
// CHECK-PREDICATOR-EMPTY: | ||
// CHECK-PREDICATOR-NEXT: #endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.