<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/123079>123079</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AMDGPU][GISel] Missing FMAX3 use
</td>
</tr>
<tr>
<th>Labels</th>
<td>
good first issue,
backend:AMDGPU,
llvm:globalisel
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
qcolombet
</td>
</tr>
</table>
<pre>
GISel fails to use the max3 (and probably min3) instruction on AMDGPU. Instead it uses a sequence of 2 max instructions.
SDISel gets this right.
I believe the AMDGPU port miss a port of the `SITargetLowering::performMinMaxCombine` optimization.
# To Reproduce #
Download the attached IR or copy/paste it from below.
Then run:
```bash
llc -O3 -march=amdgcn -mcpu=gfx942 -mtriple amdgcn-amd-hmcsa -global-isel=<0|1> repro.ll -o -
```
[repro.ll.txt](https://github.com/user-attachments/files/18427260/repro.ll.txt)
# Result #
GISel:
```asm
s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
v_max_f32_e32 v0, v0, v0
v_max_f32_e32 v0, 0, v0
v_mov_b32_e32 v4, v1
v_mov_b32_e32 v5, v2
v_max_f32_e32 v0, 0, v0
flat_store_dword v[4:5], v0
s_waitcnt vmcnt(0) lgkmcnt(0)
s_setpc_b64 s[30:31]
```
SDISel:
```asm
s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
v_mov_b32_e32 v3, v2
v_mov_b32_e32 v2, v1
v_max3_f32 v0, v0, 0, 0
flat_store_dword v[2:3], v0
s_waitcnt vmcnt(0) lgkmcnt(0)
s_setpc_b64 s[30:31]
```
GISel uses 3 `max` instructions where SDISel manages to do the same thing with just one `max3` instruction.
Note: The test case was automatically reduced hence the input values constants are not representative of the real workload.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8lU9v4zYQxT8NfRnIkEjLfw4-KHG9CNC0xW4K9GZQ1FjiLv9oyZHt9NMXlJzGa-wWvbRAICl41JuZJ_pHGaNuHeKWlQ-s3M3kQJ0P26_KG29rpFntm9fth6dPaOAotYlAHoaIQB2ClRcBjK-la6APvpa1eQWrnWB8A9pFCoMi7R14B9Xz7sNvv8_hyUVC2YCmZBNBQsSvAzqF4I_Ak-ftq3HO8urTbqzfIkWgTkcIuu0oKSyvnqBGo_E0tTSVgd4HAqtj8h-f_XGU2TL_9PQiQ4v0sz9j0K5lomKi6jEcfbDP2j3Ly6O3tXbIljn4nrTVf8rUy7Ug4wJePHzEPvhmUAiMi0nZ-bMzXjZjKUkkVYcNPH0EH0D5_pXxfS8jYRr-GLxNnftzsn3p0EEYXGomr9gyn_5qGTuWV8YoyH4VkFkZVMfETtqmVQ4yq_qBiV17vGwWHDJLQfcGYZIzaZussypKyFrja2kyHdEwsWPiMWerx4KJnyCkMebGQOYhu62dnsuHN3lOF2LljvF1R9TH1CffM75vNXVDPVfeMr4fIoZsmtuio8j4_qgNpnuxXvAVX-aM77-x5Jv3UD9iHAy9xznuurtEZLSjuImHs9SkHMHJKkeMr_O06_DS3_xn2i834vTi6WDl5XAU_ICCwyln_PH9-sMV9wv86VC_LViMWvFdrRw1_i-Nj0bSIZIPeGjOPjRwYuXDgomqHLN_X_iD6b83bzxEpF4d6uUCIisfRM5EJYpkePe1335o_0Xkt5mIu0xuNX6XpbyIFNg33-l6-XFiPE34_yQ2kXEkmUh0sfKSsHFLMDh3GBCuELPSyRZHjDZ-BEWUNrFLuxbOmjr4PEQC7_BqJ-78rhT6xRMyUcFLh0AYCZSMCGcZQQ7krSStpDGvEDAxqoFuRGyqp10_EJykGTCC8i6SdBRBBgTnaQQCRnQkSZ_wDZwBpYGzD18S3-azZiuajdjIGW6LlVhuytVmsZp123pVLhtUsliVjTrWqHJVq0Uh88VKCL5WM73lOS_zoiiLZbHJl_OFLKVcqw3ysizqomSLHK3UZm7Myc59aGc6xgG3BRf5ajMzskYTx9OK89b7Bo46RIJxEeNp-zDOa6m-oGuYqKbz4G8hmTJRTTgcach5OvbCNilZPbSRLXKjI8X3BkiTGQ_Iq1m5Y-XDBKdyB886xvTt9s_VHyLthNkQzPYfKDn2MN2yPvjPqIjx_TjASMpp0NOW_xUAAP__RLdX0w">