https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87062
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2018-08-23 Blocks| |53947 Ever confirmed|0 |1 --- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- A dup of PR84101 and others. The vectorizer has a hard time accounting for ABI details of parameter passing and return value handling because those are not reflected in GIMPLE. There's a patch posted that maybe handles this case, but I don't see a RESULT_DECL in the IL so it might not: fret (long int i) { struct pair D.7982; <bb 2> [local count: 1073741825]: MEM[(struct pair *)&D.7982] = i_2(D); MEM[(struct pair *)&D.7982 + 8B] = i_2(D); return D.7982; } that is, the vectorizer doesn't know D.7982 is forcefully allocated to a rax/rdx register pair but thinks it is memory (it is memory in GIMPLE). A heuristic besides the one in the posted patch would be to slightly pessimize non-TREE_ADDRESSABLE sources/destinations for vectorization, but if the ABI would return std::pair<long, long> in %xmm0 we'd lose. Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947 [Bug 53947] [meta-bug] vectorizer missed-optimizations