Skip to content

Commit 4f54b91

Browse files
authored
[SDPatternMatch] Only match ISD::SIGN_EXTEND in m_SExt (llvm#95415)
Context: llvm#95365 (comment) The current implementation of `m_SExt` matches both `ISD::SIGN_EXTEND` and `ISD::SIGN_EXTEND_INREG`. However, in cases where we specifically need to match _only_ `ISD::SIGN_EXTEND`, such as in the SelectionDAG graph below, this can lead to issues and unintended combinations. ``` SelectionDAG has 13 nodes: t0: ch,glue = EntryToken t2: v2i32,ch = CopyFromReg t0, Register:v2i32 %0 t21: v2i32 = sign_extend_inreg t2, ValueType:ch:v2i8 t4: v2i32,ch = CopyFromReg t0, Register:v2i32 %1 t22: v2i32 = sign_extend_inreg t4, ValueType:ch:v2i8 t23: v2i32 = avgfloors t21, t22 t24: v2i32 = sign_extend_inreg t23, ValueType:ch:v2i8 t15: ch,glue = CopyToReg t0, Register:v2i32 $d0, t24 t16: ch = AArch64ISD::RET_GLUE t15, Register:v2i32 $d0, t15:1 ```
1 parent 44df116 commit 4f54b91

File tree

2 files changed

+1
-6
lines changed

2 files changed

+1
-6
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,7 @@ template <typename Opnd> inline UnaryOpc_match<Opnd> m_ZExt(const Opnd &Op) {
642642
}
643643

644644
template <typename Opnd> inline auto m_SExt(const Opnd &Op) {
645-
return m_AnyOf(UnaryOpc_match<Opnd>(ISD::SIGN_EXTEND, Op),
646-
m_Node(ISD::SIGN_EXTEND_INREG, Op, m_Value()));
645+
return UnaryOpc_match<Opnd>(ISD::SIGN_EXTEND, Op);
647646
}
648647

649648
template <typename Opnd> inline UnaryOpc_match<Opnd> m_AnyExt(const Opnd &Op) {

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,6 @@ TEST_F(SelectionDAGPatternMatchTest, optionalResizing) {
269269
SDValue Op64 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int64VT);
270270
SDValue ZExt = DAG->getNode(ISD::ZERO_EXTEND, DL, Int64VT, Op32);
271271
SDValue SExt = DAG->getNode(ISD::SIGN_EXTEND, DL, Int64VT, Op32);
272-
SDValue SExtInReg = DAG->getNode(ISD::SIGN_EXTEND_INREG, DL, Int64VT, Op64,
273-
DAG->getValueType(Int32VT));
274272
SDValue AExt = DAG->getNode(ISD::ANY_EXTEND, DL, Int64VT, Op32);
275273
SDValue Trunc = DAG->getNode(ISD::TRUNCATE, DL, Int32VT, Op64);
276274

@@ -284,8 +282,6 @@ TEST_F(SelectionDAGPatternMatchTest, optionalResizing) {
284282
EXPECT_TRUE(A == Op64);
285283
EXPECT_TRUE(sd_match(SExt, m_SExtOrSelf(m_Value(A))));
286284
EXPECT_TRUE(A == Op32);
287-
EXPECT_TRUE(sd_match(SExtInReg, m_SExtOrSelf(m_Value(A))));
288-
EXPECT_TRUE(A == Op64);
289285
EXPECT_TRUE(sd_match(Op32, m_AExtOrSelf(m_Value(A))));
290286
EXPECT_TRUE(A == Op32);
291287
EXPECT_TRUE(sd_match(AExt, m_AExtOrSelf(m_Value(A))));

0 commit comments

Comments
 (0)