https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121775
Bug ID: 121775 Summary: arm: wrong code in vset_lane* Product: gcc Version: 16.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: rearnsha at gcc dot gnu.org Target Milestone: --- Target: arm #include <stdint.h> #include "arm_neon.h" volatile uint8_t v40 = 255; volatile uint8x8_t result = { #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 0, 0, 0, 0, 0, 0, 0, 255 #else 255, 0, 0, 0, 0, 0, 0, 0 #endif }; void check (uint8x8_t v) { int i; for (i = 0; i < 8; i++) if (v[i] != result[i]) __builtin_abort (); } int main () { uint8_t v116[16] = {0}; uint8x8_t v117 = vld1_dup_u8(v116); // 0, ..., 0 uint8x8_t v119 = vset_lane_u8(v40, v117, 7); // 0, ..., 0, 0xff check (v119); return 0; } generates wrong code because insufficient validation in the vec_set_*_internal paterns allows an invalid transformation of the operands Fix is fairly straight forward, but will need backporting.