optimization/997: Incorrect behavior in presence of glibc memset optimization

dana@boi.hp.com dana@boi.hp.com
Tue Dec 5 23:56:00 GMT 2000


>Number:         997
>Category:       optimization
>Synopsis:       Incorrect behavior in presence of glibc memset optimization
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Tue Dec 05 23:56:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Dana Jacobsen
>Release:        gcc version 2.97 20001127 (experimental)
>Organization:
>Environment:
i686-pc-linux-gnu, Pentium III, RedHat 6.2 Linux
>Description:
This program uses memset with a small compile-time fixed size.  If the glibc string optimizations are allowed (the default when optimization is used), then the memset is replaced with a large chunk of code using __builtin_memset among other things.

The test will compile properly with all snapshots I have.  When compiled with "-mcpu=i686 -O" I see these results with the following compilers:

2.95.2     OK
20000313   OK
20000807   Abort
20000904   Abort
20001002   OK
20001106   OK
20001113   Abort
20001127   Abort
20001204   Abort

The problem is seen in the check2() function where on ia32 we should be returning 1 and we do not.  check1() is identical except for an early constant return.  We abort if they are not equal, which should let us just test for this error.

To add more information, with -mcpu=i386, I get failure with -O but success with -Os, -O2, or -O3.  -mcpu=i686 gives failure on all -O levels >= 1.  Compiling without optimization avoids the problem.
>How-To-Repeat:
Use included .i file to ensure you see the same memset optimization.

#include <string.h>

typedef union {
    unsigned short  a_ushort;
    unsigned long   a_ulong;
} align_t;

static int check1(void)
{
   /* Returns 1 on ia32 */
   int r;
   align_t a;
   memset(&a,0xff,sizeof(a));
   if  (a.a_ushort == 0xFFFF)
      return 1;
   r = (a.a_ushort == 0xFFFF)  ?  1  :  0;
   return r;
}

static int check2(void)
{
   /* Should return 1 on ia32 */
   int r;
   align_t a;
   memset(&a,0xff,sizeof(a));
   r = (a.a_ushort == 0xFFFF)  ?  1  :  0;
   return r;
}

int main(void)
{
   if (check1() != check2())
      abort();
   return 0;
}
>Fix:
1. Compile without optimization (-O0).

2. Compile the source with -D__NO_STRING_INLINES to prevent glibc from touching memset.

3. Use "-O2 -mcpu=i386"
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="memset-builtins.i.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="memset-builtins.i.gz"

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
rWXJvgnrsNVLq3AF3KemyMzCzP4Di32bJ9NLAAA=


More information about the Gcc-prs mailing list