https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108677
Bug ID: 108677 Summary: wrong vectorization (when copy constructor is present?) Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: vincenzo.innocente at cern dot ch Target Milestone: --- in this real life code #include<cmath> struct trig_pair { double CosPhi; double SinPhi; trig_pair() : CosPhi(1.), SinPhi(0.) {} trig_pair(const trig_pair &tp) : CosPhi(tp.CosPhi), SinPhi(tp.SinPhi) {} trig_pair(const double C, const double S) : CosPhi(C), SinPhi(S) {} trig_pair(const double phi) : CosPhi(cos(phi)), SinPhi(sin(phi)) {} //Return trig_pair fo angle increased by angle of tp. trig_pair Add(const trig_pair &tp) { return trig_pair(this->CosPhi*tp.CosPhi - this->SinPhi*tp.SinPhi, this->SinPhi*tp.CosPhi + this->CosPhi*tp.SinPhi); } }; trig_pair *TrigArr; void FillTrigArr(trig_pair tp, unsigned MaxM) { //Fill TrigArr with trig_pair(jp*phi) if (!TrigArr) return;; TrigArr[1] = tp; for (unsigned jp = 2; jp <= MaxM; ++jp) TrigArr[jp] = TrigArr[jp-1].Add(tp); } gcc vectorize the loop even if a dependency is present...[1] It will not if I comment out the copy contructor...[2] [1] https://godbolt.org/z/vhPeh35n5 [2] https://godbolt.org/z/YPjdYdqG8