https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120692
Bug ID: 120692 Summary: Copying of adjacent fields can be merged Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: hiraditya at msn dot com Target Milestone: --- Saw this on X(https://x.com/joseph_h_garvin/status/1934705584705843340) Assigning adjacent field of struct can be merged as a copy but clang does not recognize it when the data types are different. Repro: ```cpp #include <functional> struct handle { void* data; // Replacing it with int data works. int index; }; void remove(handle* p, int idx, int& end) { auto& item = p[idx]; auto& last = p[end]; item = last; --end; } void remove2(handle* p, int idx, int& end) { auto& item = p[idx]; auto& last = p[end]; item.data = last.data; item.index = last.index; --end; } ``` $ clang -O2 ```asm remove(handle*, int, int&): ldrsw x8, [x2] ldr q0, [x0, x8, lsl #4] str q0, [x0, w1, sxtw #4] ldr w8, [x2] sub w8, w8, #1 str w8, [x2] ret remove2(handle*, int, int&): ldrsw x8, [x2] add x9, x0, w1, sxtw #4 add x8, x0, x8, lsl #4 ldr w10, [x8, #8] ldr x8, [x8] str w10, [x9, #8] ldr w10, [x2] str x8, [x9] sub w8, w10, #1 str w8, [x2] ret ``` https://godbolt.org/z/61avd145T