https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113666
--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Jeff Law <[email protected]>: https://gcc.gnu.org/g:30cfa1c174648154945c5494573fb6b5dc829fe6 commit r16-6901-g30cfa1c174648154945c5494573fb6b5dc829fe6 Author: Jeff Law <[email protected]> Date: Mon Jan 19 07:44:54 2026 -0700 [PR target/113666] Simplify VEC_EXTRACT from a uniform vector This fixes a P3 regression relative to gcc-13 on the RISC-V platform for this code: > unsigned char a; > > int main() { > short b = a = 0; > for (; a != 19; a++) > if (a) > b = 32872 >> a; > > if (b == 0) > return 0; > else > return 1; > } > > -march=rv64gcv_zvl256b -mabi=lp64d -O3 -ftree-vectorize Doesn't need vector at all. Good code generation here looks like: > lui a5,%hi(a) > li a4,19 > sb a4,%lo(a)(a5) > li a0,0 > ret gcc-14 and gcc-15 produce horrific code here, roughly 20 instructions, over half of which are vector. It's not even worth posting, it's atrocious. The trunk improves things, but not quite to the quality of gcc-13: > vsetivli zero,8,e16,mf2,ta,ma > vmv.v.i v1,0 > lui a5,%hi(a) > li a4,19 > vslidedown.vi v1,v1,1 > sb a4,%lo(a)(a5) > vmv.x.s a0,v1 > snez a0,a0 > ret If we look at the .optimized dump we have this nugget: > _26 = .VEC_EXTRACT ({ 0, 0, 0, 0, 0, 0, 0, 0 }, 1); If we're extracting an element out of a uniform vector, then any element will do and it's conveniently returned by uniform_vector_p. So with a simple match.pd pattern that simplifies to _26 = 0. That in turn allows elimination of all the vector code and simplify the return value to a constant as well, resulting in the desired code shown earlier. One could easily argue that this need not be restricted to a uniform vector and I would totally agree. But given we're in stage4, the minimal fix for the regression seems more appropriate. But I could certainly be convinced to handle the more general case here. Bootstrapped and regression tested on x86 & riscv64. Tested across the cross configurations as well with no regressions. PR target/113666 gcc/ * fold-const-call.cc (fold_const_vec_extract): New function. (fold_const_call, case CFN_VEC_EXTRACT): Call it. * match.pd (IFN_VEC_EXTRACT): Handle extraction from a uniform vector. gcc/testsuite * gcc.target/riscv/rvv/base/pr113666.c: New test. Co-authored-by: Andrew Pinski <[email protected]>
