https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84232
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed| |2018-02-07 Target Milestone|--- |8.0 Summary|[8 regression] |[8 regression] |gcc.dg/tree-ssa/ssa-dom-cse |gcc.dg/tree-ssa/ssa-dom-cse |-2.c fail |-2.c fail with | |-march=silvermont Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- It works for me with stock settings. With -march=silvermont I see constant init not vectorized and thus a similar situation as in /* On alpha, the vectorizer generates writes of two vector elements at once, but the loop reads only one element at a time, and DOM cannot resolve these. The same happens on powerpc depending on the SIMD support available. */ /* { dg-final { scan-tree-dump "return 28;" "optimized" { xfail { { alpha*-*-* hppa*64*-*-* nvptx*-*-* } || { { { lp64 && { powerpc*-*-* sparc*-*-* riscv*-*-* } } || aarch64_sve } || { arm*-*-* && { ! arm_neon } } } } } } } */ IL is <bb 2> [local count: 119292718]: MEM[(int *)&a] = 4294967296; MEM[(int *)&a + 8B] = 12884901890; MEM[(int *)&a + 16B] = 21474836484; MEM[(int *)&a + 24B] = 30064771078; vect__1.4_18 = MEM[(int *)&a]; vect__1.4_22 = MEM[(int *)&a + 16B]; and DOM cannot resolve this. Without silvermont I see vect_cst__31 = { 0, 1, 2, 3 }; vect_cst__24 = { 4, 5, 6, 7 }; MEM[(int *)&a] = vect_cst__31; _2 = &a[0] + 16; MEM[(int *)_2] = vect_cst__24; for the stores which matches the vector reads. The cost model changes now properly cost two constant vectors while it costed one before. constant vectors are costed as aligned vector loads (from the constant pool). This is a kown limitation of DOM/SLP.