https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106433
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hubicka at gcc dot gnu.org, | |jakub at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Last reconfirmed| |2022-07-25 Keywords| |openmp Target Milestone|--- |13.0 Status|UNCONFIRMED |NEW Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. It looks like bar.simdclone.0 () is not pure but bar () was pure, so sth is amiss in the simd cloning pass here? We have vector(2) int foo.simdclone.0 () { ... # VUSE <.MEM_7> _1 = bar (0); but at IPA we don't yet know bar() is pure (its IL writes to memory). Likely late local pure/cost discovery fixes that up and affects foo.simdclone.0 but the simdclone decl for bar() is created earlier (but not adjusted?). Should local-pure-const also affect aliases/clones (are the simdclone clones even visible properly to do this?). I guess simply adjusting the simdclone decl from the vectorizer when detecting the mismatch in virtual operands is too ugly. vector(2) int foo.simdclone.0 () { ... # .MEM = VDEF <.MEM_7> vect__1.39_12 = bar.simdclone.0 (vect_cst__11);