This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, rs6000] generate loop code for memcmp inline expansion


On 08/01/18 19:37, Aaron Sawdey wrote:
> On Tue, 2017-12-12 at 10:13 -0600, Segher Boessenkool wrote:
>> > Please fix those trivialities, and it's okay for trunk (after the
>> > rtlanal patch is approved too).  Thanks!
> Here's the final version of this, which is committed as 256351.
> 
> 
> 2018-01-08  Aaron Sawdey  <acsawdey@linux.vnet.ibm.com>
> 
> 	* config/rs6000/rs6000-string.c (do_load_for_compare_from_addr): New
> 	function.
> 	(do_ifelse): New function.
> 	(do_isel): New function.
> 	(do_sub3): New function.
> 	(do_add3): New function.
> 	(do_load_mask_compare): New function.
> 	(do_overlap_load_compare): New function.
> 	(expand_compare_loop): New function.
> 	(expand_block_compare): Call expand_compare_loop() when appropriate.
> 	* config/rs6000/rs6000.opt (-mblock-compare-inline-limit): Change
> 	option description.
> 	(-mblock-compare-inline-loop-limit): New option.
> 
...
> Index: gcc/testsuite/gcc.dg/memcmp-1.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/memcmp-1.c	(revision 256350)
> +++ gcc/testsuite/gcc.dg/memcmp-1.c	(working copy)
> @@ -14,11 +14,80 @@
>  #ifndef NRAND
>  #define NRAND 10000
>  #endif
> -#define MAX_SZ 200
> +#define MAX_SZ 600
>  

i see timeouts when running aarch64-none-elf tests in some
emulator environments:

WARNING: program timed out.
FAIL: gcc.dg/memcmp-1.c execution test

if there is a way to reduce the iteration count or the
tested variants that would help slow targets.

> +#define DEF_RS(ALIGN)                                                      \
> +static void test_memcmp_runtime_size_ ## ALIGN (const char *str1, 	   \
> +						const char *str2,	   \
> +						size_t sz, int expect)	   \
> +{									   \
> +  char three[8192] __attribute__ ((aligned (4096)));			   \
> +  char four[8192] __attribute__ ((aligned (4096)));			   \
> +  char *a, *b;								   \
> +  int i,j,a1,a2,r;							   \
> +  for (j = 0; j < 2; j++)						   \
> +    {									   \
> +      for (i = 0; i < 2; i++)						   \
> +	{								   \
> +	  a = three+i*ALIGN+j*(4096-2*i*ALIGN);				   \
> +	  b = four+i*ALIGN+j*(4096-2*i*ALIGN);				   \
> +	  memcpy(a,str1,sz);						   \
> +	  memcpy(b,str2,sz);						   \
> +	  asm(" ");							   \
> +	  r = memcmp(a,b,sz);						   \
> +	  asm(" ");							   \
> +	  if ( r < 0 && !(expect < 0) ) abort();			   \
> +	  if ( r > 0 && !(expect > 0) )	abort();			   \
> +	  if ( r == 0 && !(expect == 0) ) abort();			   \
> +	}								   \
> +    }									   \
> +}
> +
> +DEF_RS(1)
> +DEF_RS(2)
> +DEF_RS(4)
> +DEF_RS(8)
> +DEF_RS(16)
> +
> +static void test_memcmp_runtime_size (const char *str1, const char *str2,
> +				      size_t sz, int expect)
> +{
> +  char three[8192] __attribute__ ((aligned (4096)));
> +  char four[8192] __attribute__ ((aligned (4096)));
> +  char *a, *b;
> +  int i,j,a1,a2,r;
> +  test_memcmp_runtime_size_1 (str1,str2,sz,expect);
> +  test_memcmp_runtime_size_2 (str1,str2,sz,expect);
> +  test_memcmp_runtime_size_4 (str1,str2,sz,expect);
> +  test_memcmp_runtime_size_8 (str1,str2,sz,expect);
> +  test_memcmp_runtime_size_16 (str1,str2,sz,expect);
> +  for (j = 0; j < 2; j++)
> +    {
> +      for (i = 0; i < 2; i++)
> +	{
> +	  for (a1=0; a1 < 2*sizeof(void *); a1++)
> +	    {
> +	      for (a2=0; a2 < 2*sizeof(void *); a2++)
> +		{
> +		  a = three+i*a1+j*(4096-2*i*a1);
> +		  b = four+i*a2+j*(4096-2*i*a2);
> +		  memcpy(a,str1,sz);
> +		  memcpy(b,str2,sz);
> +		  asm(" ");
> +		  r = memcmp(a,b,sz);
> +		  asm(" ");
> +		  if ( r < 0 && !(expect < 0) ) abort();
> +		  if ( r > 0 && !(expect > 0) )	abort();
> +		  if ( r == 0 && !(expect == 0) ) abort();
> +		}
> +	    }
> +	}
> +    }
> +}
> +
>  static void test_driver_memcmp (void (test_memcmp)(const char *, const char *, int),
>  				void (test_strncmp)(const char *, const char *, int),
> -				size_t sz, int align)
> +  size_t sz, int align)
>  {
>    char buf1[MAX_SZ*2+10],buf2[MAX_SZ*2+10];
>    size_t test_sz = (sz<MAX_SZ)?sz:MAX_SZ;
> @@ -35,11 +104,12 @@
>  	buf1[j] = rand() & 0xff;
>  	buf2[j] = rand() & 0xff;
>        }
> +      e = lib_memcmp(buf1,buf2,sz);
> +      (*test_memcmp)(buf1,buf2,e);
> +      test_memcmp_runtime_size (buf1, buf2, sz, e);
> +      e = lib_strncmp(buf1,buf2,sz);
> +      (*test_strncmp)(buf1,buf2,e);
>      }
> -    e = lib_memcmp(buf1,buf2,sz);
> -    (*test_memcmp)(buf1,buf2,e);
> -    e = lib_strncmp(buf1,buf2,sz);
> -    (*test_strncmp)(buf1,buf2,e);
>    }
>    for(diff_pos = ((test_sz>10)?(test_sz-10):0); diff_pos < test_sz+10; diff_pos++)
>      for(zero_pos = ((test_sz>10)?(test_sz-10):0); zero_pos < test_sz+10; zero_pos++)
> @@ -53,6 +123,9 @@
>  	(*test_memcmp)(buf1,buf2,e);
>  	(*test_memcmp)(buf2,buf1,-e);
>  	(*test_memcmp)(buf2,buf2,0);
> +	test_memcmp_runtime_size (buf1, buf2, sz, e);
> +	test_memcmp_runtime_size (buf2, buf1, sz, -e);
> +	test_memcmp_runtime_size (buf2, buf2, sz, 0);
>  	e = lib_strncmp(buf1,buf2,sz);
>  	(*test_strncmp)(buf1,buf2,e);
>  	(*test_strncmp)(buf2,buf1,-e);
> @@ -61,6 +134,7 @@
>  	buf2[diff_pos] = 0;
>  	e = lib_memcmp(buf1,buf2,sz);
>  	(*test_memcmp)(buf1,buf2,e);
> +	test_memcmp_runtime_size (buf1, buf2, sz, e);
>  	e = lib_strncmp(buf1,buf2,sz);
>  	(*test_strncmp)(buf1,buf2,e);
>  	memset(buf2+diff_pos,'B',sizeof(buf2)-diff_pos);
> @@ -68,6 +142,8 @@
>  	e = lib_memcmp(buf1,buf2,sz);
>  	(*test_memcmp)(buf1,buf2,e);
>  	(*test_memcmp)(buf2,buf1,-e);
> +	test_memcmp_runtime_size (buf1, buf2, sz, e);
> +	test_memcmp_runtime_size (buf2, buf1, sz, -e);
>  	e = lib_strncmp(buf1,buf2,sz);
>  	(*test_strncmp)(buf1,buf2,e);
>  	(*test_strncmp)(buf2,buf1,-e);
> @@ -371,7 +447,14 @@
>  DEF_TEST(100,4)
>  DEF_TEST(100,8)
>  DEF_TEST(100,16)
> +DEF_TEST(191,1)
> +DEF_TEST(192,1)
> +DEF_TEST(193,1)
> +DEF_TEST(200,1)
> +DEF_TEST(400,1)
>  #else
> +DEF_TEST(1,1)
> +DEF_TEST(2,1)
>  DEF_TEST(3,1)
>  DEF_TEST(4,1)
>  DEF_TEST(5,1)
> @@ -389,6 +472,8 @@
>  DEF_TEST(32,1)
>  DEF_TEST(100,1)
>  DEF_TEST(100,8)
> +DEF_TEST(180,1)
> +DEF_TEST(180,8)
>  #endif
>  
>  int
> @@ -395,7 +480,7 @@
>  main(int argc, char **argv)
>  {
>  #ifdef TEST_ALL
> -  RUN_TEST(1,1)
> +    RUN_TEST(1,1)
>      RUN_TEST(1,2)
>      RUN_TEST(1,4)
>      RUN_TEST(1,8)
> @@ -645,7 +730,14 @@
>      RUN_TEST(100,4)
>      RUN_TEST(100,8)
>      RUN_TEST(100,16)
> +    RUN_TEST(191,1)
> +    RUN_TEST(192,1)
> +    RUN_TEST(193,1)
> +    RUN_TEST(200,1)
> +    RUN_TEST(400,1)
>  #else
> +    RUN_TEST(1,1)
> +    RUN_TEST(2,1)
>      RUN_TEST(3,1)
>      RUN_TEST(4,1)
>      RUN_TEST(5,1)
> @@ -663,5 +755,7 @@
>      RUN_TEST(32,1)
>      RUN_TEST(100,1)
>      RUN_TEST(100,8)
> +    RUN_TEST(180,1)
> +    RUN_TEST(180,8)
>  #endif
>  }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]