https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92080
--- Comment #16 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by H.J. Lu <h...@gcc.gnu.org>: https://gcc.gnu.org/g:aba3b9d3a48a0703fd565f7c5f0caf604f59970b commit r16-1644-gaba3b9d3a48a0703fd565f7c5f0caf604f59970b Author: H.J. Lu <hjl.to...@gmail.com> Date: Fri May 9 07:17:07 2025 +0800 x86: Extend the remove_redundant_vector pass Extend the remove_redundant_vector pass to handle vector broadcasts from constant and variable scalars. When broadcasting from constants and function arguments, we can place a single widest vector broadcast at entry of the nearest common dominator for basic blocks with all uses since constants and function arguments aren't changed. For broadcast from variables with a single definition, the single definition is replaced with the widest broadcast. gcc/ PR target/92080 * config/i386/i386-expand.cc (ix86_expand_call): Set recursive_function to true for recursive call. * config/i386/i386-features.cc (ix86_place_single_vector_set): Add an argument for inner scalar, default to nullptr. Set the source from inner scalar if not nullptr. (ix86_get_vector_load_mode): Renamed to ... (ix86_get_vector_cse_mode): This. Add an argument for scalar mode and handle integer and float scalar modes. (replace_vector_const): Add an argument for scalar mode and pass it to ix86_get_vector_load_mode. (x86_cse_kind): New. (redundant_load): Likewise. (ix86_broadcast_inner): Likewise. (remove_redundant_vector_load): Also support const0_rtx and constm1_rtx broadcasts. Handle vector broadcasts from constant and variable scalars. * config/i386/i386.h (machine_function): Add recursive_function. gcc/testsuite/ * gcc.target/i386/keylocker-aesdecwide128kl.c: Updated to expect movdqa instead pxor. * gcc.target/i386/keylocker-aesdecwide256kl.c: Likewise. * gcc.target/i386/keylocker-aesencwide128kl.c: Likewise. * gcc.target/i386/keylocker-aesencwide256kl.c: Likewise. * gcc.target/i386/pr92080-4.c: New test. * gcc.target/i386/pr92080-5.c: Likewise. * gcc.target/i386/pr92080-6.c: Likewise. * gcc.target/i386/pr92080-7.c: Likewise. * gcc.target/i386/pr92080-8.c: Likewise. * gcc.target/i386/pr92080-9.c: Likewise. * gcc.target/i386/pr92080-10.c: Likewise. * gcc.target/i386/pr92080-11.c: Likewise. * gcc.target/i386/pr92080-12.c: Likewise. * gcc.target/i386/pr92080-13.c: Likewise. * gcc.target/i386/pr92080-14.c: Likewise. * gcc.target/i386/pr92080-15.c: Likewise. * gcc.target/i386/pr92080-16.c: Likewise. * gcc.target/i386/pr92080-17.c: Likewise. * gcc.target/i386/pr92080-18.c: Likewise. * gcc.target/i386/pr92080-19.c: Likewise. * gcc.target/i386/pr92080-20.c: Likewise. Signed-off-by: H.J. Lu <hjl.to...@gmail.com>