mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[MIPatternMatch]: Add mi_match for MachineInstr
This utility allows more efficient start of pattern match. Often MachineInstr(MI) is available and instead of using mi_match(MI.getOperand(0).getReg(), MRI, ...) followed by MRI.getVRegDef(Reg) that gives back MI we now use mi_match(MI, MRI, ...). Differential Revision: https://reviews.llvm.org/D99735
This commit is contained in:
parent
00669818e5
commit
692456b891
@ -25,6 +25,11 @@ bool mi_match(Reg R, const MachineRegisterInfo &MRI, Pattern &&P) {
|
||||
return P.match(MRI, R);
|
||||
}
|
||||
|
||||
template <typename Pattern>
|
||||
bool mi_match(MachineInstr &MI, const MachineRegisterInfo &MRI, Pattern &&P) {
|
||||
return P.match(MRI, &MI);
|
||||
}
|
||||
|
||||
// TODO: Extend for N use.
|
||||
template <typename SubPatternT> struct OneUse_match {
|
||||
SubPatternT SubPat;
|
||||
@ -182,6 +187,11 @@ template <> struct bind_helper<MachineInstr *> {
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
static bool bind(const MachineRegisterInfo &MRI, MachineInstr *&MI,
|
||||
MachineInstr *Inst) {
|
||||
MI = Inst;
|
||||
return MI;
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct bind_helper<LLT> {
|
||||
|
@ -51,6 +51,37 @@ TEST_F(AArch64GISelMITest, MatchIntConstantRegister) {
|
||||
EXPECT_EQ(Src0, MIBCst.getReg(0));
|
||||
}
|
||||
|
||||
TEST_F(AArch64GISelMITest, MachineInstrPtrBind) {
|
||||
setUp();
|
||||
if (!TM)
|
||||
return;
|
||||
auto MIBAdd = B.buildAdd(LLT::scalar(64), Copies[0], Copies[1]);
|
||||
// Test 'MachineInstr *' bind.
|
||||
// Default mi_match.
|
||||
MachineInstr *MIPtr = MIBAdd.getInstr();
|
||||
bool match = mi_match(MIPtr, *MRI, m_GAdd(m_Reg(), m_Reg()));
|
||||
EXPECT_TRUE(match);
|
||||
// Specialized mi_match for MachineInstr &.
|
||||
MachineInstr &MI = *MIBAdd.getInstr();
|
||||
match = mi_match(MI, *MRI, m_GAdd(m_Reg(), m_Reg()));
|
||||
EXPECT_TRUE(match);
|
||||
// MachineInstrBuilder has automatic conversion to MachineInstr *.
|
||||
match = mi_match(MIBAdd, *MRI, m_GAdd(m_Reg(), m_Reg()));
|
||||
EXPECT_TRUE(match);
|
||||
// Match instruction without def.
|
||||
auto MIBBrcond = B.buildBrCond(Copies[0], B.getMBB());
|
||||
MachineInstr *MatchedMI;
|
||||
match = mi_match(MIBBrcond, *MRI, m_MInstr(MatchedMI));
|
||||
EXPECT_TRUE(match);
|
||||
EXPECT_TRUE(MIBBrcond.getInstr() == MatchedMI);
|
||||
// Match instruction with two defs.
|
||||
auto MIBUAddO =
|
||||
B.buildUAddo(LLT::scalar(64), LLT::scalar(1), Copies[0], Copies[1]);
|
||||
match = mi_match(MIBUAddO, *MRI, m_MInstr(MatchedMI));
|
||||
EXPECT_TRUE(match);
|
||||
EXPECT_TRUE(MIBUAddO.getInstr() == MatchedMI);
|
||||
}
|
||||
|
||||
TEST_F(AArch64GISelMITest, MatchBinaryOp) {
|
||||
setUp();
|
||||
if (!TM)
|
||||
|
Loading…
Reference in New Issue
Block a user