| Issue |
177107
|
| Summary |
[ARM][ISel] Miscompile for arm neon vqdmlal
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
hstk30-hw
|
https://godbolt.org/z/T93587eM8
```
#include <arm_neon.h>
#include <stdio.h>
typedef union {
struct {
int _xxx:24;
unsigned int FZ:1;
unsigned int DN:1;
unsigned int AHP:1;
unsigned int QC:1;
int V:1;
int C:1;
int Z:1;
int N:1;
} b;
unsigned int word;
} _ARM_FPSCR;
extern void abort(void);
extern void *memset(void *, int, size_t);
extern void *memcpy(void *, const void *, size_t);
extern size_t strlen(const char *);
static int32_t result_int32x4[4];
static float32_t result_float32x4[4];
static void clean_results (void)
{
memset(result_int32x4, 0x33, sizeof(result_int32x4));;
}
int64_t buffer_int64x2 [] = { (int64_t)-16, (int64_t)-15, };
int32_t buffer_int32x4 [] = { (int32_t)-16, (int32_t)-15, (int32_t)-14, (int32_t)-13, };
static volatile int __read_neon_cumulative_sat (void) {
_ARM_FPSCR _afpscr_for_qc;
asm volatile ("vmrs %0,fpscr" : "=r" (_afpscr_for_qc));
return _afpscr_for_qc.b.QC;
}
int main (void)
{
int32x4_t vector_int32x4;
int16x4_t vector3_int16x4;
int16x4_t vector4_int16x4;
int32x4_t vector_res_int32x4;
clean_results ();
vector_int32x4 = vld1q_s32(buffer_int32x4);
vector3_int16x4 = vdup_n_s16(0x8000);
vector4_int16x4 = vdup_n_s16(0x8000);
_ARM_FPSCR _afpscr_for_qc;
asm volatile ("vmrs %0,fpscr" : "=r" (_afpscr_for_qc));
_afpscr_for_qc.b.QC = (0);
// asm volatile ("vmsr fpscr,%1" : "=g" ((vector_res_int32x4)) : "r" (_afpscr_for_qc));
asm volatile ("vmsr fpscr,%0" : : "r" (_afpscr_for_qc) : "memory");
vector_res_int32x4 = vqdmlal_s16(vector_int32x4, vector3_int16x4, vector4_int16x4);
vst1q_s32(result_int32x4, vector_res_int32x4);
if (__read_neon_cumulative_sat() != 1) {
printf("fail\n");
abort();
}
printf("success\n");
return 0;
}
```
The code is fail, cause instruction
```
vqdmlal.s16 q9, d16, d16
```
is before
```
vmrs r0, fpscr
bic r0, r0, #134217728
vmsr fpscr, r0
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs