https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106069
--- Comment #21 from Kewen Lin <linkw at gcc dot gnu.org> --- I didn't look into this in details, but something in the culprit commit caught my eyes, take altivec_vmrghh as example: Before the patch, the pattern [(set (match_operand:V8HI 0 "register_operand" "=v") (vec_select:V8HI (vec_concat:V16HI (match_operand:V8HI 1 "register_operand" "v") (match_operand:V8HI 2 "register_operand" "v")) (parallel [(const_int 0) (const_int 8) (const_int 1) (const_int 9) (const_int 2) (const_int 10) (const_int 3) (const_int 11)])))] can match vmrghh on BE while vmrglh on LE. It indicates this pattern has different semantic from underlying instruction perspectives. After the patch, this pattern only matches vmrghh. IMHO, this part has semantic change before and after the patch. The code before the patch looks more reasonable to me, since the pattern can have different meanings on BE and LE (underlying behavior).