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.

Reply via email to