https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114323
prathamesh3492 at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |prathamesh3492 at gcc dot gnu.org --- Comment #3 from prathamesh3492 at gcc dot gnu.org --- Just to expand on previous comments: Before patch, input to dse is: uint32x4_t D.13560; const uint32_t D.13545[4]; uint32x4_t V0; __simd128_uint32_t _7; <bb 2> : # .MEM_2 = VDEF <.MEM_1(D)> D.13545 = *.LC0; # .MEM_8 = VDEF <.MEM_2> _7 = __builtin_mve_vld1q_uv4si (&D.13545); # .MEM_6 = VDEF <.MEM_8> D.13545 ={v} {CLOBBER(eos)}; # VUSE <.MEM_6> return _7; In this case, we have following virtual def-use chain: .MEM_1(D) -> .MEM_2 -> .MEM_8 -> .MEM_6 However after patch, input to dse is: const uint32_t D.13539[4]; uint32x4_t V0; <bb 2> : # .MEM_2 = VDEF <.MEM_1(D)> D.13539 = *.LC0; V0_3 = vld1q_u32 (&D.13539); # .MEM_5 = VDEF <.MEM_2> D.13539 ={v} {CLOBBER(eos)}; # VUSE <.MEM_5> return V0_3; There's a missing use of MEM_2 in call to vld1q_u32, and since the only use of MEM_2 now is in clobber statement, dse considers it as a dead store, and simplifies it to: <bb 2> : V0_3 = vld1q_u32 (&D.13539); # .MEM_5 = VDEF <.MEM_1(D)> D.13539 ={v} {CLOBBER(eos)}; # VUSE <.MEM_5> return V0_3; thus passing uninitialized pointer to vld1q_u32. Thanks, Prathamesh