<div dir="ltr"><div>I'd like to propose a PatternMatch-like interface for SelectionDAG.</div><div><br></div><div>I have a simple implementation attached, it matches on SDValue types and provides a convenience overload for SDNodes.</div>
<div><br></div><div>Currently, it uses similar names to PattternMatch.h (match, m_And, etc.).</div><div>I don't really care about the names but I figured to start with something familiar. They shouldn't conflict because they would both exist in their own namespaces.</div>
<div><br></div><div>The effect is pretty nice on some DAGCombiner code:</div><div><br></div><div> // (or (and X, C1), (and Y, C2)) -> (and (or X, Y), C3) if possible.</div><div> if (N0.getOpcode() == ISD::AND &&</div>
<div> N1.getOpcode() == ISD::AND &&</div><div> N0.getOperand(1).getOpcode() == ISD::Constant &&</div><div> N1.getOperand(1).getOpcode() == ISD::Constant &&</div><div> // Don't increase # computations.<br>
</div><div> (N0.getNode()->hasOneUse() || N1.getNode()->hasOneUse())) {</div><div> const APInt &LHSMask =</div><div> cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();</div><div> const APInt &RHSMask =</div>
<div> cast<ConstantSDNode>(N1.getOperand(1))->getAPIntValue();</div><div><br></div><div>becomes:</div><div> const APInt *LHSMask, *RHSMask;</div><div> if (match(N0, m_And(m_Value(), m_APInt(LHSMask))) &&<br>
</div><div> match(N1, m_And(m_Value(), m_APInt(RHSMask))) &&<br></div><div><div> // Don't increase # computations.<br></div></div><div> (match(N0, m_OneUse()) || match(N1, m_OneUse()))) {</div>
<div><br></div><div>Note that the attached implementation is pretty incomplete, I just wanted a proof of concept before I run off and flesh it out further.</div><div><br></div><div>Thanks</div><div><br></div><div>-- </div>
<div>David Majnemer</div></div>