<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/118847>118847</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[DAG] SDPatternMatch - add matchers for reassociatable binops
</td>
</tr>
<tr>
<th>Labels</th>
<td>
good first issue,
llvm:SelectionDAG
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
For binop opcodes that are commutable + reassociatable (ISD::AND/OR/OR/ADD/MUL etc.) we need support for a variable args matchers that can match operands that might be in different locations in a dependency chain:
e.g.
```
(add X, (add Y, Z))
(add (add X, Y), (add Z, W))
(add X, (add Y, (add Z, W)))
SDValue X, Y, Z, W;
m_Add(m_Value(X), m_Value(Y), m_Value(Z))
m_Add(m_Value(X), m_Value(Y), m_Value(Z), m_Value(W))
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykU0FvnDwQ_TXmMsoKBtiYAwcSxKdPbdoqq7ZJLpGxB3AFGNkmVf59ZbK7iZLeKlkwvHlvmIE3wjndz0Qly69YXkdi9YOx5e2ng57MHLVGPZeNsdDq2SxgFmkUOfCD8CAsgTTTtHrRjgQMr8CScM5ILU4Q__9Qs7RiaVV9qRk2X29Pl6oOzzffPwN5uWNYwG-CmUiBW5fFWA-dsSDgSVi9FRO2dzAJLweyxw6kmF8QMAtZMasjPul-8NAS6BmU7jqyNHsYjRRem9kFWICihWZFs3wGOQg9hzbjcGjX70K0j48nrhhyoRTcMbyGY3wf4geGRThnxlvi_ZY8Cx5C_PO94EPJv7FfBHF1qH-IcaVz-esTLb1icTU9Vkox5NPjxmLI744dvCL3H5DXEf5F_xZ5M-PpE0aqTFWRFiKiMrlM0wyTItlHQ3nZEecF7zqxb7nKi32cCszkvhAoE0r2kS4xxizBOE94nCf5Lu54nlOSU8czLpRkWUyT0ONuHJ-mnbF9pJ1bqUwSzrPLaBQtjW5zN2JvjIJOW-dhIzFEhtcMMWhZWh1oJBksUlf_hVxeR7YMuYt27R3L4lE7717f5LUft80J_LyGQ_1NeE92vtlMeQHhT54tG_z8bkG2rXLRasdy8H5xwYPYMGx67Ye13UkzMWy27l5uF4s1v0h6hs02gWPYHCd9KvFPAAAA__8yBCQb">