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

    <tr>
        <th>Summary</th>
        <td>
            Miscompile from "[DAG] Create fptosi.sat from clamped fptosi" [D111976]
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          pirama-arumuga-nainar
      </td>
    </tr>
</table>

<pre>
    (@kbeyls, @david-greene-cb, @stephenhines )

This bug was discovered in Android's audio code.  The following code does a conversion followed by clamp which is miscompiled by this change:

```
$ cat clamp.cpp 
typedef int int32_t;
typedef short int16_t;

#define INT16_MIN        (-32768)
#define INT16_MAX        (32767)
template<class T>
const T& min(const T& a, const T& b)
{
      return (b < a) ? b : a;
}

template<class T>
const T& max(const T& a, const T& b)
{
      return (a < b) ? b : a;
}

int32_t read(void *data, int32_t numFrames, const float *signal, int32_t channelCount, int32_t framesRead) {
    int16_t *shortData = (int16_t *) data;

    int32_t framesLeft = numFrames;
    while (framesLeft > 0) {
        int32_t numSamples = framesRead * channelCount;
        for (int i = 0; i < numSamples; i++) {
            int32_t n = (int32_t) (*signal++ * 32768.0f);
            *shortData++ = min(INT16_MAX, max(INT16_MIN, n)); // clip
        }
        framesLeft -= framesRead;
    }
    return numFrames - framesLeft;
}
```
Build this test case with `-target aarch64-linux-android10000 -O2`.  The vectorized copy of the loop used to get the `sqxtn` instruction to do the saturated convertion to short:
```
 @.LBB0_8:
        ldr     q0, [x2], #16
        subs    x17, x17, #4
        fcvtzs  v0.4s, v0.4s, #15
        sqxtn   v0.4h, v0.4s
        str     d0, [x0], #8
        b.ne    .LBB0_8
```

With D111976, `xtn` is generated insted:
```
.LBB0_8:
       ldr     q0, [x2], #16
       subs    x17, x17, #4
       fcvtzs  v0.4s, v0.4s, #15
       xtn     v0.4h, v0.4s
       str     d0, [x0], #8
       b.ne    .LBB0_8
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVluPmzgU_jXkxQKBSQh54CGXzqpS25V2R-q-VQab4F3Hpthkkv76PTb37LSa0SISsH38ne9cTa7oPfNw6q3Df3J2F9rDRwQDSq6c-ueGMcn8Iu9ntWF1xWTFJdPIwzsvPHnhvvt_rrhGeXtGL0QjynWhrqxhFHGJ9pI2ilMPbzUiLeUKFYqyAKHniqFSCaFeuDy7SUQVQBN4l7BdcyV7AUDK76gQ5FKjl4oXFQJ1F6vmUnPRrRpLoaiIPDMv3s_JeUnY390Qr1FBTAcXFHWNunlzrxllJXA29hfjb8aLD8s1XanGrUbJbHXAjUEEvIM-fnmG9c8fv6D-Ah_7Md4m6eS2R-H9XzNhK7sdZQ271IIYMOsInLVGz178oVsCT2kDY5yAOyTsnE0QG7fZOJ-Ub3vincKGmbaRVm-OQIfduIOXJ2SHexiOdm5Pc4PfyIvc_jcv4njlb-TVBw_2E0i79ArZByB7SoxTPSzL9vLUkAvTE59SKEgMkNX8LImYS9vMkkwcVSvNfL50EH84VcBubkGfJg7P5s0JCADzk7Votmb3OW7LdOoRZko-sdK4_RPzeKYOCkMwi72Q_oDC_xCbQwPWn1AHwtY0QE_mWGpLq-MHiFI1vSmIu80hiLjX4wzWzXn44O5XiCzIzNzj6s9ugP40BcTCOGaunIKwtMnzSKyrosnpwzbA7qpkrDkbyS5Bx5q1U9KiOmDAeYIbmgWvl0rGpBvdMbndX7pyQXCxr0_xMaDIn8G8kt_LTnZouaBd4zMM0rcgmqEXbioEIr4hzZkZREhTVMnaF1y2N5903TgK4UL-7xgE-1Z8ZYVRDf8B3bRQ9R2pEpAZEkrVqNUwaxSyeHYSdunvNyPhCbHTpmkLY7s1iFDlJDQBw6A30L6ZD8suJlN_XtpjT5ng0-EQfktHkcG7gjbu-T10x9HmcMPe5uTecRwlS2Hd5to-b9HWSvQPEFw_hKy4mh8geQ2DtWsD44sF3TyAWotRJ1xNwksZ07GkI8twYpkuZfMAuj9cg8WvnlXu_6sN6SmKot02cVhJODhfQ0wk6zxtI8Hoz5z7E8e-x69vdOt7vNq59JdOfYdPf-3SFc1iuot3ZGW4ESz7PH5AQNGpC8CB6YfT_jeAR0c4PQws1EZpHkA6dzLuowF83c3DDktoCM3mtGobkVXG1Nr62bWOMwSvzQPQBAMhrsPDrxv1N9QcDLnWrT2GnjbrJIxWVUZwmaSYgXmbqMRrUqQhyUmRxGm-wXQXrQTJmdAZ6LZKeYZDjMMYpzgO13Ea7GixYxvK8oKUQGwNdcUuhIvAKg5Uc141meMAn2waFgXXRk-LcJZDu2VswCetgbLNag6tifikaS_tmfiScEmalSOfOeb_AvpS3CM">