[llvm-branch-commits] [llvm] cc90d41 - [MIPatternMatch] Add m_OneNonDBGUse
Jessica Paquette via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jan 15 10:23:24 PST 2021
Author: Jessica Paquette
Date: 2021-01-15T10:18:46-08:00
New Revision: cc90d41945f6c72d92fbbc6e7b38ceff6e7e1e93
URL: https://github.com/llvm/llvm-project/commit/cc90d41945f6c72d92fbbc6e7b38ceff6e7e1e93
DIFF: https://github.com/llvm/llvm-project/commit/cc90d41945f6c72d92fbbc6e7b38ceff6e7e1e93.diff
LOG: [MIPatternMatch] Add m_OneNonDBGUse
Add a matcher that checks if the given subpattern has only one non-debug use.
Also improve existing m_OneUse testcase.
Differential Revision: https://reviews.llvm.org/D94705
Added:
Modified:
llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h b/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
index ed93dae24c05..55d6d365fbb4 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
@@ -39,6 +39,20 @@ inline OneUse_match<SubPat> m_OneUse(const SubPat &SP) {
return SP;
}
+template <typename SubPatternT> struct OneNonDBGUse_match {
+ SubPatternT SubPat;
+ OneNonDBGUse_match(const SubPatternT &SP) : SubPat(SP) {}
+
+ bool match(const MachineRegisterInfo &MRI, Register Reg) {
+ return MRI.hasOneNonDBGUse(Reg) && SubPat.match(MRI, Reg);
+ }
+};
+
+template <typename SubPat>
+inline OneNonDBGUse_match<SubPat> m_OneNonDBGUse(const SubPat &SP) {
+ return SP;
+}
+
struct ConstantMatch {
int64_t &CR;
ConstantMatch(int64_t &C) : CR(C) {}
diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
index a63a34f91545..8a5d8e783399 100644
--- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
@@ -392,13 +392,24 @@ TEST_F(AArch64GISelMITest, MatchMiscellaneous) {
LLT s64 = LLT::scalar(64);
auto MIBAdd = B.buildAdd(s64, Copies[0], Copies[1]);
- // Make multiple uses of this add.
+ Register Reg = MIBAdd.getReg(0);
+
+ // Only one use of Reg.
B.buildCast(LLT::pointer(0, 32), MIBAdd);
+ EXPECT_TRUE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
+ EXPECT_TRUE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
+
+ // Add multiple debug uses of Reg.
+ B.buildInstr(TargetOpcode::DBG_VALUE, {}, {Reg})->getOperand(0).setIsDebug();
+ B.buildInstr(TargetOpcode::DBG_VALUE, {}, {Reg})->getOperand(0).setIsDebug();
+
+ EXPECT_FALSE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
+ EXPECT_TRUE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
+
+ // Multiple non-debug uses of Reg.
B.buildCast(LLT::pointer(1, 32), MIBAdd);
- bool match = mi_match(MIBAdd.getReg(0), *MRI, m_GAdd(m_Reg(), m_Reg()));
- EXPECT_TRUE(match);
- match = mi_match(MIBAdd.getReg(0), *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg())));
- EXPECT_FALSE(match);
+ EXPECT_FALSE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
+ EXPECT_FALSE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
}
TEST_F(AArch64GISelMITest, MatchSpecificConstant) {
More information about the llvm-branch-commits
mailing list