<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/141622>141622</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AMDGPU] InstCombine moving freeze instructions breaks FMA formation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jayfoad
      </td>
    </tr>
</table>

<pre>
    This is a code quality issue that has been affecting some graphics workloads recently. The LLPC frontend tends to insert `freeze` instructions between `cmp` and conditional `br` instructions, to avoid undefined behavior if the condition is undef or poison. Then InstCombine moves the `freeze` instructions into places where they interfere with optimizations like FMA formation.

With this [test case](https://github.com/user-attachments/files/20460389/r.txt) I get this ISA including a `v_fma_f32` instruction:
```
$ llc -mtriple=amdgcn -mcpu=gfx1010 r.txt -o -
...
main:                                   ; @main
; %bb.0:                                ; %bb
        s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
        v_fma_f32 v0, v0, v1, 1.0
        v_cmp_lt_f32_e32 vcc_lo, 0, v0
        v_cndmask_b32_e64 v0, 0, 1, vcc_lo
        s_setpc_b64 s[30:31]
```
But after running it through InstCombine, I get separate `v_mul_f32` and `v_add_f32` instructions:
```
$ opt -passes=instcombine r.txt -o - | llc -mtriple=amdgcn -mcpu=gfx1010
...
main:                                   ; @main
; %bb.0:                                ; %bb
        s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
        v_mul_f32_e32 v0, v0, v1
        v_add_f32_e32 v0, 1.0, v0
        v_cmp_lt_f32_e32 vcc_lo, 0, v0
        v_cndmask_b32_e64 v0, 0, 1, vcc_lo
        s_setpc_b64 s[30:31]

```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUVU2P4ygT_jXkUkqE8UeSgw_pjvKqpRlppHdWe4wwlG2mMXihnHTPr1_huKc_NLs7p5U2irCAp6qoeh4oGaPpHGLNyjtWHldyot6H-pt8br3Uq8br5_prbyKYCBKU1wh_TNIaegYT44RAvSToZYQG0YFsW1RkXAfRDwhdkGNvVISrD4_WSx0hoEJH9nkDX3uET5--3EMbvCN0GtIQgTwYFzEQsIq3AfE7soqnNQqTIuNdCkbXFI9VXA1j2pZOg_JOmwSQNu004aMdE_fJvbx4o2FyGlvjUEODvbwYH8C0QD2--klZzzDwAUZvonfzuR08uEj3fmiMQxj8BeNs-NcHNo48jFYqjHDtMaTC4XNaxtCm6dVQD34kM5jv8mZjzSPC6fMBWh-GeW3D-IHxw-8JS4kVVt4RRgIlI7LyyMSuJxojyw9MnJg4dYb6qdkoPzBxmiKGtSSSqh_QUWTi1BqL6St4UfF8t2fiFDb0REzs4QE6pFuYh_8fwDhlJ52olSnPy7kd5LnNxYdUU2h-YBVf_vzARAHWKlgPFMxokeVHOehOOVgPapxYfuzap4xnHObQsPawZvyw2aRsB2mSS_jnH8vvgBV8NuCHeSbKptnwXzD_gZ7ru4_nqzSkHMFlUI6Y2PFUEHwa38xs9_hm82b4oyhw4Ulry5ilMdvwF5AaxrOlhDtjwip1tj5hXoxecE4PMj6emwSsisXdPMwuF8PlzBFpVOemKiCy8i5PeedZEsV7Ou4mAtkSBgiTc4lPk1gOfur6t7JOAW4SiDjKIAlvtA-TfaE93bl5TWr9EynEn2vBjwTrUcaIkeXHhFfLRXrlH9j2_tdE859VylLHmwLeq2VBLFV9g0gaeq-Qf11Jb_hc6TrX-3wvV1hn22KXV1zwatXXrcZyW271ftdmW72Te4VcybLYVlrpUu5WphZclLwU26zMq6LaFPusyLf5Nmt25baRkhUcB2nsxtrLsPGhW83dps6KrBJiZWWDNs49SwiH11svYkKkFhbqZLRupi6yglsTKb66IUN2bnaHz8f_ffmNlcePT3m6EbdH_EPLCSgf4_v3eDUFW__Ni5vCLp_1GPw3VMTEaT5senWXbC61-DMAAP__rKlFpw">