<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">