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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] SMIN(a,0) and SMAX(a,0) performance regression after SPF canonicalization to intrinsics
        </td>
    </tr>

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

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

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

<pre>
    On AArch64, SMIN(a,0) and SMAX(a,0) are no longer being peeped after the following commit:

```
commit a266af721153fab6452094207b09ed265ab0be7b (HEAD)
Author: Nikita Popov [npopov@redhat.com](mailto:npopov@redhat.com)
Date:   Mon Feb 14 17:18:07 2022 +0100

    [InstCombine] Canonicalize SPF to min/max intrinsics
    
    Now that integer min/max intrinsics have good support in both
    InstCombine and other passes, start canonicalizing SPF min/max
    to intrinsic min/max.
    
    Once this sticks, we can stop matching SPF min/max in various
    places, and can remove hacks we have for preventing infinite loops
    and breaking of SPF canonicalization.
    
    Differential Revision: https://reviews.llvm.org/D98152
```

This is causing a ~6% slowdown on 372.smithwa (with an out-of-tree optimizer).

I've reduced a test case to:

```
; RUN: llc -mtriple=aarch64 %s -o -

declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone
define i64 @smaxi64_zero(i64 %a) {
  ; Expected: bic x0, x0, x0, asr #63
  %c = call i64 @llvm.smax.i64(i64 %a, i64 0)
  ret i64 %c
}

declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone
define i64 @smini64_zero(i64 %a) {
  ; Expected: and x0, x0, x0, asr #63
  %c = call i64 @llvm.smin.i64(i64 %a, i64 0)
  ret i64 %c
}
```

This seems simple to peep, but it's really a can of worms. The problem is that marking the ISD::SMIN/ISD::SMAX nodes as Legal/Custom in AArch64ISelLowering is triggering other target-independent lowering code that also has performance regressions. E.g. the calls to TLI.isOperationLegalOrCustom(...) in SelectionDAGBuilder::visitSelect(…).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVlFvozgX_TXOy1UQmADhIQ-0NN9XaaYdTWeleVsZuIC3xka2SWbmYX_76kLSptrMblcjVRRi-9xzj-89tnBOdhpxx5IblpQrMfne2N1QSy2U-r6qTPN996ihKGzdpxvGb-Hp4_0D41vB-G3IeA5CN_D0sfj65jeLoA0oozu0UKHUHYyIIzYgWo8WfI_QGqXMkYZqMwzSs7hgYcnC8zMNT3_z5zIHBE9T0WY8ipK4FVW6SXiYb3iYVWGODU8TUYUVZhUwvv3_XVEyni_rizkzFhfwIJ-lF_DJjOYALLnRI72xTWix6YUPajOwpGR8OwipvGFxcW3GGbcUHgkV4KPRsMcKog1EGYuLaMviIsyAh5wD4zdhFIaXCQIAhb_Xzt-aoZIaWVLCrdBGy1oo-QPh6dMevIFBasb3g_gGUnsrtZO1u8B4eXswR_C98DQNSflrC6EXB4TOmAbcNI7G0nSojO9fgS44zftrfI8WRuEcOqoB54X1UL9SpV0ksi8BX7G8eQ3-Oh5c4_-oawTfSwfOy_p5DnVEigPOmxEG4ev-b6GI_kFYaaYLUUYl6oUr8ScEi4M5IPSifnaEOsvQGgujxQNqT7hSt1JLj6CMGS_QCKOyKJ5pkmnn-BfZCy-NvppRKdsWLaELBZ_xIJ00msql9350VPF8z_je4kHi0QVKHYbA2I7xfZlvo4RfbYXl-YV0kg5qMTmiJeDPlPEEnDLHxhw1GA1xxgM3SN8fBTXEUfoehAYz-bVp194ighm9HOQPtIznwSX-PePZAcFiM9XUt-DR0Z47hLkp_qFXWXwDn397oDyVqmE9eCtHhSwuhZh9BBhPHKwNrC9RGqwVOYekCZtwFsNRrUhynq1c1pHJwOm9IrOxKBptNJ5BWqraEwYtl-nm9x9ozRuIHFh2c94n4nv3bcTaY0OkK1nDt5DiXD6Fs8B4nMYvy3hSA4tLqIVS72UdvjgHgEV_zqQ-CZGV_66I1L-kiNT_XRFqgF9U5Kes36vIT5vAIQ4OnBxGRbU5nzQEXk0epGc8c6SIUt9BzE5gWjgaO7gAvvQIozWVwoFaafbOQdi5zemIun8qqdLjYjn09hffxVfQpkEHwsEH7IRifH87OW8G8qPTeXn_hOqDOaKdzcWBt7Lrlq_FUr2wHfq11A2OqBvUHtR5fm0aXCgJ5Qz0wsGItjV2EOSTFjuLjvzEBXAXdMHMmIR3JMKXD_eBdI8j2tmdZoqPdmHI-DYIAtpyqeEJFdY0pSz-dzNJ1aBdciSz8sso41t2x9k2ZEVKPrFqdnGTx7lY4S5Kt2EYZTxNVv0uzLgQadTGQiRplPK2TTdVvtlsBWITR_FK7njI4zDm5G7ZJgl4nPM8z1rkOYZRsmWbEOngffHClXRuwl0aZWm2UqJC5ebbCucajzAPMs7p8mJ3tGZdTZ2jspPOvzrqykuv5mvO-SqTlO-6ylyX_HSNuXYOvDnw3GqyavfW7Dvp-6laLhF74nf6tx6t-WMWez9n5Rjfz1n_FQAA__-Xn-h0">