x86: Add gcc.target/i386/strncmp-1.c

Add a strncmp test for the cmpstrn pattern with neither of the strings
is a constant string.  We can expand the cmpstrn pattern to "repz cmpsb"
only if one of the strings is a constant so that expand_builtin_strncmp()
can write the length argument to be the minimum of the const string
length and the actual length argument.  Otherwise, "repz cmpsb" may pass
the 0 byte.

	* gcc.target/i386/strncmp-1.c: New test.
This commit is contained in:
H.J. Lu 2020-05-17 06:52:02 -07:00
parent e7e785dfec
commit cc558e2801
2 changed files with 51 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2020-05-17 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/strncmp-1.c: New test.
2020-05-16 Iain Sandoe <iain@sandoe.co.uk>
* g++.dg/coroutines/co-return-syntax-10-movable.C: New test.

View File

@ -0,0 +1,47 @@
/* { dg-do run { target mmap } } */
/* { dg-options "-O2" } */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif
int
__attribute__ ((noclone, noinline))
compare (char *d, char *s, unsigned int l)
{
return __builtin_strncmp (d, s, l);
}
int
main ()
{
size_t page_size = sysconf(_SC_PAGESIZE);
char *buf = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (buf == MAP_FAILED)
{
perror ("mmap");
abort ();
}
if (mprotect (buf + page_size, page_size, PROT_NONE))
{
perror ("mprotect");
abort ();
}
char *src1 = buf + page_size - sizeof ("foo");
char *src2 = buf;
memcpy (src1, "foo", sizeof ("foo"));
memcpy (src2, "foo", sizeof ("foo"));
int result = compare (src1, src2, sizeof ("foo") + 16);
if (result != 0)
abort ();
return 0;
}