https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93407
Bug ID: 93407 Summary: Dead partial memset not optimized away (clang does that) Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hubicka at gcc dot gnu.org Target Milestone: --- While analyzing GCC for PR93404 I noticed that gen_rtx_fmt_ee 34 rtx 35 gen_rtx_fmt_ee (code, mode, arg0, arg1) 36 RTX_CODE code; 37 enum machine_mode mode; 38 rtx arg0; 39 rtx arg1; 40 { 41 rtx rt; 42 rt = ggc_alloc_rtx (2); 43 memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion)); 44 45 PUT_CODE (rt, code); 46 PUT_MODE (rt, mode); 47 XEXP (rt, 0) = arg0; 48 XEXP (rt, 1) = arg1; 49 50 return rt; 51 } gets quite odd codegen which gets inlined many times: gen_rtx_fmt_ee(): /aux/hubicka/403.gcc/src/genrtl.c:41 4036ae: bf 18 00 00 00 mov $0x18,%edi init_reload(): /aux/hubicka/403.gcc/src/reload1.c:500 4036b3: 41 0f 95 c6 setne %r14b 4036b7: 49 89 c5 mov %rax,%r13 gen_rtx_fmt_ee(): /aux/hubicka/403.gcc/src/genrtl.c:41 4036ba: e8 d1 64 0d 00 callq 4d9b90 <ggc_alloc> init_reload(): /aux/hubicka/403.gcc/src/reload1.c:500 4036bf: 41 83 c6 04 add $0x4,%r14d plus_constant_wide(): /aux/hubicka/403.gcc/src/genrtl.c:41 4036c3: be 04 00 00 00 mov $0x4,%esi gen_rtx_fmt_ee(): /aux/hubicka/403.gcc/src/genrtl.c:42 4036c8: c7 40 03 00 00 00 00 movl $0x0,0x3(%rax) /aux/hubicka/403.gcc/src/genrtl.c:41 4036cf: 48 89 c7 mov %rax,%rdi /aux/hubicka/403.gcc/src/genrtl.c:42 4036d2: c6 40 07 00 movb $0x0,0x7(%rax) /aux/hubicka/403.gcc/src/genrtl.c:44 4036d6: b8 4b 00 00 00 mov $0x4b,%eax 4036db: 66 89 07 mov %ax,(%rdi) /aux/hubicka/403.gcc/src/genrtl.c:45 4036de: 44 88 77 02 mov %r14b,0x2(%rdi) /aux/hubicka/403.gcc/src/genrtl.c:46 4036e2: 4c 89 6f 08 mov %r13,0x8(%rdi) /aux/hubicka/403.gcc/src/genrtl.c:47 4036e6: 4c 89 67 10 mov %r12,0x10(%rdi) For exmaple 4036c8: c7 40 03 00 00 00 00 movl $0x0,0x3(%rax) seems to be leftover of the memset code. Clang does: gen_rtx_fmt_ee(): /aux/hubicka/403.gcc/src/genrtl.c:43 67c72f: bf 18 00 00 00 mov $0x18,%edi 67c734: e8 a7 1a eb ff callq 52e1e0 <ggc_alloc> 67c739: 49 89 c6 mov %rax,%r14 /aux/hubicka/403.gcc/src/genrtl.c:44 67c73c: 48 c7 00 00 00 00 00 movq $0x0,(%rax) /aux/hubicka/403.gcc/src/genrtl.c:46 67c743: 8d 85 4b 00 04 00 lea 0x4004b(%rbp),%eax /aux/hubicka/403.gcc/src/genrtl.c:47 67c749: 41 89 06 mov %eax,(%r14) /aux/hubicka/403.gcc/src/genrtl.c:48 67c74c: 49 89 5e 08 mov %rbx,0x8(%r14) /aux/hubicka/403.gcc/src/genrtl.c:49 67c750: 4d 89 7e 10 mov %r15,0x10(%r14) which simply fills in the rtx header and the two XEXP pointers.