https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98658
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- it's because (gdb) p debug_data_dependence_relation (ddr) (Data Dep: #(Data Ref: # bb: 3 # stmt: _1 = *s_19; # ref: *s_19; # base_object: *s_7(D); # Access function 0: {0B, +, 4}_1 #) #(Data Ref: # bb: 3 # stmt: *d_18 = _1; # ref: *d_18; # base_object: *d_6(D); # Access function 0: {0B, +, 4}_1 #) (don't know) ) and we say /* Can't do memmove in case of unknown dependence or dependence without classical distance vector. */ if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know || DDR_NUM_DIST_VECTS (ddr) == 0) return; which is because we need to check the depdenence is not backwards (*s++ loads an earlier stored value). I don't see how that is guaranteed in the 'copy' case and ICC either miscompiles this or has a runtime check doing the memcpy only conditionally.