1  /* Copyright (C) 2002, 2005  Free Software Foundation.
       2  
       3     Test -minline-all-stringops memset with various combinations of pointer
       4     alignments and lengths to make sure builtin optimizations are correct.
       5     PR target/6456.
       6  
       7     Written by Michael Meissner, March 9, 2002.
       8     Target by Roger Sayle, April 25, 2002.  */
       9  
      10  /* { dg-do run } */
      11  /* { dg-options "-O2 -minline-all-stringops" } */
      12  
      13  extern void *memset (void *, int, __SIZE_TYPE__);
      14  extern void abort (void);
      15  extern void exit (int);
      16  
      17  #ifndef MAX_OFFSET
      18  #define MAX_OFFSET (sizeof (long long))
      19  #endif
      20  
      21  #ifndef MAX_COPY
      22  #define MAX_COPY (8 * sizeof (long long))
      23  #endif
      24  
      25  #ifndef MAX_EXTRA
      26  #define MAX_EXTRA (sizeof (long long))
      27  #endif
      28  
      29  #define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
      30  
      31  static union {
      32    char buf[MAX_LENGTH];
      33    long long align_int;
      34    long double align_fp;
      35  } u;
      36  
      37  char A = 'A';
      38  
      39  int
      40  main ()
      41  {
      42    int off, len, i;
      43    char *p, *q;
      44  
      45    for (off = 0; off < MAX_OFFSET; off++)
      46      for (len = 1; len < MAX_COPY; len++)
      47        {
      48  	for (i = 0; i < MAX_LENGTH; i++)
      49  	  u.buf[i] = 'a';
      50  
      51  	p = memset (u.buf + off, '\0', len);
      52  	if (p != u.buf + off)
      53  	  abort ();
      54  
      55  	q = u.buf;
      56  	for (i = 0; i < off; i++, q++)
      57  	  if (*q != 'a')
      58  	    abort ();
      59  
      60  	for (i = 0; i < len; i++, q++)
      61  	  if (*q != '\0')
      62  	    abort ();
      63  
      64  	for (i = 0; i < MAX_EXTRA; i++, q++)
      65  	  if (*q != 'a')
      66  	    abort ();
      67  
      68  	p = memset (u.buf + off, A, len);
      69  	if (p != u.buf + off)
      70  	  abort ();
      71  
      72  	q = u.buf;
      73  	for (i = 0; i < off; i++, q++)
      74  	  if (*q != 'a')
      75  	    abort ();
      76  
      77  	for (i = 0; i < len; i++, q++)
      78  	  if (*q != 'A')
      79  	    abort ();
      80  
      81  	for (i = 0; i < MAX_EXTRA; i++, q++)
      82  	  if (*q != 'a')
      83  	    abort ();
      84  
      85  	p = memset (u.buf + off, 'B', len);
      86  	if (p != u.buf + off)
      87  	  abort ();
      88  
      89  	q = u.buf;
      90  	for (i = 0; i < off; i++, q++)
      91  	  if (*q != 'a')
      92  	    abort ();
      93  
      94  	for (i = 0; i < len; i++, q++)
      95  	  if (*q != 'B')
      96  	    abort ();
      97  
      98  	for (i = 0; i < MAX_EXTRA; i++, q++)
      99  	  if (*q != 'a')
     100  	    abort ();
     101        }
     102  
     103    exit(0);
     104  }
     105