https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116075
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |enhancement Component|target |tree-optimization Last reconfirmed| |2024-07-24 Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org Status|UNCONFIRMED |ASSIGNED Target|aarch64 |aarch64 riscv Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- > _72 = .VEC_SHL_INSERT ({ 0, ... }, 0); Confirmed. This could be optimized at the gimple level to just `{0, ...}` I think. And it shows up in RISCV too: ``` vsetvli a4,zero,e32,m1,ta,ma vmv.v.i v2,0 csrr a3,vlenb li a0,32768 srli a3,a3,2 addi a0,a0,-768 lui a5,%hi(in) vslide1up.vx v1,v2,zero ``` The internal function is a direct function to the optab vec_shl_insert: ``` @cindex @code{vec_shl_insert_@var{m}} instruction pattern @item @samp{vec_shl_insert_@var{m}} Shift the elements in vector input operand 1 left one element (i.e.@: away from element 0) and fill the vacated element 0 with the scalar in operand 2. Store the result in vector output operand 0. Operands 0 and 1 have mode @var{m} and operand 2 has the mode appropriate for one element of @var{m}. ``` So if we have 0 for both then the result is also 0. So this should fold it: ``` (simplify (INF_VEC_SHL_INSERT @1 uniform_vector_p@2) (if (operands_equal (@1, uniform_vector_p(@2)) @2)) ``` That is if we are inserting a value that is the same as the uniform vector we can just simplify it to the uniform vector. I will take care of this.