https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90492
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Target|x86_64-suse-linux |x86_64-*-*, i?86-*-* Status|UNCONFIRMED |NEW Last reconfirmed| |2019-05-16 CC| |hjl.tools at gmail dot com Ever confirmed|0 |1 --- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. This is probably the generic block-copying (move_by_pieces) code expanding MEM[(char * {ref-all})&b] = MEM[(char * {ref-all})&a]; and the target directing it to at most use SSE regs: /* MOVE_MAX_PIECES is the number of bytes at a time which we can move efficiently, as opposed to MOVE_MAX which is the maximum number of bytes we can move with a single instruction. ??? We should use TImode in 32-bit mode and use OImode or XImode if they are available. But since by_pieces_ninsns determines the widest mode with MAX_FIXED_MODE_SIZE, we can only use TImode in 64-bit mode. */ #define MOVE_MAX_PIECES \ ((TARGET_64BIT \ && TARGET_SSE2 \ && TARGET_SSE_UNALIGNED_LOAD_OPTIMAL \ && TARGET_SSE_UNALIGNED_STORE_OPTIMAL) \ ? GET_MODE_SIZE (TImode) : UNITS_PER_WORD) not sure if the MAX_FIXED_MODE_SIZE comment is still valid.