public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/23605] New: memset() Optimization on x86-32 bit
@ 2005-08-28 20:08 kevin at planetsaphire dot com
  2005-08-28 20:16 ` [Bug target/23605] " pinskia at gcc dot gnu dot org
                   ` (12 more replies)
  0 siblings, 13 replies; 17+ messages in thread
From: kevin at planetsaphire dot com @ 2005-08-28 20:08 UTC (permalink / raw)
  To: gcc-bugs

I have a bit of a disagreement with the optimization toward memset()
calls.  In one of my libraries, libteklti, I have a function named
ucharempty(), which frees a uchar_t (unique character structure) from
memory.  If the user elects to have the memory erased prior to calling
free(), memset() is supposed to reset the memory about to be freed.

In gcc 4.0.1, I have noticed that the optimization for memset()
calls has a few extra instructions in the generated assembly that do not
need to be inserted.

Per Ian Lance Taylor's request, I am going to attatch to this bug only
the source code and .i files as a tarball.

If you look closely, you can see that %edi can be automatically loaded
directly without problems, and that (%eax) can be directly loaded into
(%esp).


The following disassembly output is an example for the line:

0x08049172 <ucharempty+53>: mov    0x8(%ebp),%eax
0x08049175 <ucharempty+56>: mov    0x4(%eax),%edx
0x08049178 <ucharempty+59>: mov    0x8(%ebp),%eax
0x0804917b <ucharempty+62>: mov    (%eax),%ebx
0x0804917d <ucharempty+64>: mov    %ebx,%edi
0x0804917f <ucharempty+66>: cld
0x08049180 <ucharempty+67>: mov    %edx,%ecx
0x08049182 <ucharempty+69>: mov    $0x0,%al
0x08049184 <ucharempty+71>: repz stos %al,%es:(%edi)
0x08049186 <ucharempty+73>: mov    %ebx,%eax
0x08049188 <ucharempty+75>: mov    %eax,(%esp)
0x0804918b <ucharempty+78>: call   0x8048c08 <free>

associated C code:

#ifdef    TEKLTI_ENFORCE_PRIVACY
    free(
        memset(
            uchrtofree->uchar_t_ascii,
            '\0',
            sizeof(char) * uchrtofree->uchar_t_asciilen
        )
    );
#else    /* not USE_386_ASM_ENFORCE_PRIVACY */



For reference:


Dump of assembler code for function ucharempty, for comparison:

>From uchar.c:
0x0804913d <ucharempty+0>: push   %ebp
0x0804913e <ucharempty+1>: mov    %esp,%ebp
0x08049140 <ucharempty+3>: push   %edi
0x08049141 <ucharempty+4>: push   %ebx
0x08049142 <ucharempty+5>: sub    $0x10,%esp
0x08049145 <ucharempty+8>: cmpl   $0x0,0x8(%ebp)
0x08049149 <ucharempty+12>: jne    0x8049172 <ucharempty+53>
0x0804914b <ucharempty+14>: mov    0x804c1cc,%eax
0x08049150 <ucharempty+19>: mov    %eax,0xc(%esp)
0x08049154 <ucharempty+23>: movl   $0x35,0x8(%esp)
0x0804915c <ucharempty+31>: movl   $0x1,0x4(%esp)
0x08049164 <ucharempty+39>: movl   $0x804b120,(%esp)
0x0804916b <ucharempty+46>: call   0x8048c58 <free+80>
0x08049170 <ucharempty+51>: jmp    0x804919b <ucharempty+94>
0x08049172 <ucharempty+53>: mov    0x8(%ebp),%eax
0x08049175 <ucharempty+56>: mov    0x4(%eax),%edx
0x08049178 <ucharempty+59>: mov    0x8(%ebp),%eax
0x0804917b <ucharempty+62>: mov    (%eax),%ebx
0x0804917d <ucharempty+64>: mov    %ebx,%edi
0x0804917f <ucharempty+66>: cld
0x08049180 <
ucharempty+67>: mov    %edx,%ecx
0x08049182 <ucharempty+69>: mov    $0x0,%al
0x08049184 <ucharempty+71>: repz stos %al,%es:(%edi)
0x08049186 <ucharempty+73>: mov    %ebx,%eax
0x08049188 <ucharempty+75>: mov    %eax,(%esp)
0x0804918b <ucharempty+78>: call   0x8048c08 <free>
0x08049190 <ucharempty+83>: mov    0x8(%ebp),%eax
0x08049193 <ucharempty+86>: mov    %eax,(%esp)
0x08049196 <ucharempty+89>: call   0x8048c08 <free>
0x0804919b <ucharempty+94>: add    $0x10,%esp
0x0804919e <ucharempty+97>: pop    %ebx
0x0804919f <ucharempty+98>: pop    %edi
0x080491a0 <ucharempty+99>: pop    %ebp
0x080491a1 <ucharempty+100>: ret
End of assembler dump.


>From uchar.386.c:

Dump of assembler code for function ucharempty:
0x08048fde <ucharempty+0>: push   %ebp
0x08048fdf <ucharempty+1>: mov    %esp,%ebp
0x08048fe1 <ucharempty_passpushpop+0>: mov    0x8(%ebp),%ecx
0x08048fe4 <ucharempty_passpushpop+3>: push   %edi
0x08048fe5 <ucharempty_passpushpop+4>: mov    (%ecx),%edi
0x08048fe7 <ucharempty_passpushpop+6>: push   %edi
0x08048fe8 <ucharempty_passpushpop+7>: mov    0x4(%ecx),%ecx
0x08048feb <ucharempty_passpushpop+10>: mov    $0x0,%al
0x08048fed <ucharempty_passpushpop+12>: repz stos %al,%es:(%edi)
0x08048fef <ucharempty_passpushpop+14>: call   0x8048be0 <free>
0x08048ff4 <ucharempty_passpushpop+19>: pop    %edi
0x08048ff5 <ucharempty_passpushpop+20>: pop    %edi
0x08048ff6 <ucharempty_passpushpop+21>: mov    %ebp,%esp
0x08048ff8 <ucharempty_passpushpop+23>: pop    %ebp
0x08048ff9 <ucharempty_passpushpop+24>: jmp    0x8048be0 <free>
End of assembler dump.

-- 
           Summary: memset() Optimization on x86-32 bit
           Product: gcc
           Version: 4.0.1
            Status: UNCONFIRMED
          Severity: minor
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kevin at planetsaphire dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: -g -O0
  GCC host triplet: Kernel 2.6.12
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23605


^ permalink raw reply	[flat|nested] 17+ messages in thread
[parent not found: <bug-23605-11252@http.gcc.gnu.org/bugzilla/>]
[parent not found: <bug-23605-4@http.gcc.gnu.org/bugzilla/>]

end of thread, other threads:[~2012-01-11 14:21 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-08-28 20:08 [Bug c/23605] New: memset() Optimization on x86-32 bit kevin at planetsaphire dot com
2005-08-28 20:16 ` [Bug target/23605] " pinskia at gcc dot gnu dot org
2005-08-28 20:26 ` kevin at planetsaphire dot com
2005-08-28 20:28 ` kevin at planetsaphire dot com
2005-08-28 20:34 ` pinskia at gcc dot gnu dot org
2005-08-28 20:37 ` kevin at planetsaphire dot com
2005-08-28 20:45 ` pinskia at gcc dot gnu dot org
2005-08-28 22:18 ` kevin at planetsaphire dot com
2005-08-28 23:00 ` pinskia at gcc dot gnu dot org
2005-08-28 23:03 ` pinskia at gcc dot gnu dot org
2005-08-28 23:25 ` ian at airs dot com
2005-08-28 23:42 ` ian at airs dot com
2005-08-29  0:36 ` kevin at planetsaphire dot com
2005-08-29  0:49 ` kevin at planetsaphire dot com
     [not found] <bug-23605-11252@http.gcc.gnu.org/bugzilla/>
2005-11-02 17:16 ` pinskia at gcc dot gnu dot org
2006-09-18  1:45 ` pinskia at gcc dot gnu dot org
     [not found] <bug-23605-4@http.gcc.gnu.org/bugzilla/>
2012-01-11 14:21 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).