<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/84746>84746</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[DAG] Failure to recognise ISD::AVGFLOORS -> ISD::AVGFLOORU fold for non-negative arguments
</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>
https://rust.godbolt.org/z/ejh1bh97q
Pulled out of Hacker's Delight - if a signed floor average is between known non-negative arguments then the unsigned variant can be used instead, to potentially allow further simplification in the future.
(Sorry only aarch64 has decent ISD::AVG coverage atm):
```ll
define <8 x i16> @uhadd_in_disguise(<8 x i16> %a0, <8 x i16> %a1) {
%m0 = and <8 x i16> %a0, <i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510>
%m1 = and <8 x i16> %a1, <i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510>
%r = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %m0, <8 x i16> %m1)
ret <8 x i16> %r
}
declare <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16>, <8 x i16>)
```
```asm
uhadd_in_disguise: // @uhadd_in_disguise
mov w8, #510 // =0x1fe
dup v2.8h, w8
and v0.16b, v0.16b, v2.16b
and v1.16b, v1.16b, v2.16b
shadd v0.8h, v0.8h, v1.8h // <--- FIXME - could be uhadd
ret
```
CC @davemgreen
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vcuu2zYQ_RpqM7AgUk8vvHCsqzRoixS5aNFdQIkjiQlFuiRl5_brC0q-T7sBChQRDJEcHh-eeWjInZODRtyR_B3J64jPfjR29-nnezkZHbVGPOxG74-OpHvCGsIaOzsfD0a0RvnY2IGw5m_CGvwy0nbcln-RpCbJfn3_NiuFAszswfTwE---oiWsdFCjksPoYQOyBw6LBgG9MsYCP6HlA4J00KI_I2r4qs1ZgzZ6o3HgXp4QuB3mCbV34EfU4QWzvvCcuJVce-i4hhZhdihAaueRC8IO4A0cjUftJVfqAbhS5gz9bP2IFpycjkr2suNeGg1ype5nP1uMX_pGWHVvrH0AowMJt91YZDByBwI71B4-3NchaOl-_8d76MzFK-4nwrZhY2UpkvWn1GoQ2EuNQNJDBd9A0oKkd0CyZB65EJ-l_iykG2bpkLDqDYjlPAn-XZspYVsg5bv1CAi2KQGS1sC1uIF_pJG0gJwuq_9vmt69lEG_I4P-MBl2UdFxpa4jr9Rpii_5jTUaHbuQi_hUBcyNLEy3szCFLDyeadFfI-ylJsr6sRY6xe2NYvhPkq7EPMl4Kr43S-6m1XJddOkebj5rb7hdqBeX12cyp2U8V4suluY0uU35TJrWyTfavyES83EZTyyuxsB1rl4DQk0tgCSmRRsQL2Zsmd3G0ycU_R5-CfnKvwp4ntC4Gl97cNhsNtB8-PPXO9hAZ2Ylls4UKF6zWvQ3k3M4hOAKfsJpsKEnRmKXim265RHuaEkTmpclK6NxV7EtK4u2bctM5IxVW-TYFTlN84ImVcIiuWMJy5KUUkqzKivjvtyKjLZYiIxuK8FJluDEpYqXOjN2iKRzM-6qrMyKSPEWlVsuDMYGYwT00joPC4YwRtiBMBb-StL9PSrsQiet9-_DXl5Hdhf2Nu08uFDK0nn3fJCXXi2XUcDnNTRcqtli6NkWOzNo6fBVZ21--fjx0z1swpdxZf8deqME9Mb-y-URzVa9ud8G6ce5jTszEdYsXqzD5mjNF-w8Yc3iqSOsWQLyTwAAAP__yun-cA">