[PATCH] D135378: [GlobalISel] Add a m_SpecificReg matcher
Jessica Paquette via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 6 10:56:30 PDT 2022
paquette created this revision.
paquette added reviewers: aemerson, arsenm.
Herald added a subscriber: rovka.
Herald added a project: All.
paquette requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
Similar to the specific matchers for constants.
The intention here is to make it easier to write combines which check if a specific register is used more than once.
e.g. matching patterns like:
(X + Y) == Y
https://reviews.llvm.org/D135378
Files:
llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
Index: llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
===================================================================
--- llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
+++ llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
@@ -769,6 +769,23 @@
EXPECT_TRUE(mi_match(AddInst.getReg(2), *MRI, m_Not(m_Reg(NotReg))));
EXPECT_EQ(NotReg, Copies[0]);
}
+
+TEST_F(AArch64GISelMITest, MatchSpecificReg) {
+ setUp();
+ if (!TM)
+ return;
+ auto Cst1 = B.buildConstant(LLT::scalar(64), 42);
+ auto Cst2 = B.buildConstant(LLT::scalar(64), 314);
+ Register Reg = Cst1.getReg(0);
+ // Basic case: Same register twice.
+ EXPECT_TRUE(mi_match(Reg, *MRI, m_SpecificReg(Reg)));
+ // Basic case: Two explicitly different registers.
+ EXPECT_FALSE(mi_match(Reg, *MRI, m_SpecificReg(Cst2.getReg(0))));
+ // Check that we can tell that an instruction uses a specific register.
+ auto Add = B.buildAdd(LLT::scalar(64), Cst1, Cst2);
+ EXPECT_TRUE(mi_match(Add.getReg(0), *MRI, m_GAdd(m_SpecificReg(Reg), m_Reg())));
+}
+
} // namespace
int main(int argc, char **argv) {
Index: llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
===================================================================
--- llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
+++ llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
@@ -237,6 +237,20 @@
}
///}
+/// Matcher for a specific register.
+struct SpecificRegisterMatch {
+ Register RequestedReg;
+ SpecificRegisterMatch(Register RequestedReg) : RequestedReg(RequestedReg) {}
+ bool match(const MachineRegisterInfo &MRI, Register Reg) {
+ return Reg == RequestedReg;
+ }
+};
+
+/// Matches a register only if it is equal to \p RequestedReg.
+inline SpecificRegisterMatch m_SpecificReg(Register RequestedReg) {
+ return SpecificRegisterMatch(RequestedReg);
+}
+
// TODO: Rework this for different kinds of MachineOperand.
// Currently assumes the Src for a match is a register.
// We might want to support taking in some MachineOperands and call getReg on
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135378.465786.patch
Type: text/x-patch
Size: 2038 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221006/e08dc86a/attachment.bin>
More information about the llvm-commits
mailing list